读取内存:

  • [addr] read a DWORD/QWORD from addr.
  • n:[addr] read n bytes from addr.   在32位程序中 n<4, 64位程序中 n<8
  • seg:[addr] read a DWORD/QWORD from a segment at addr.
  • byte:[addr] read a BYTE from addr.
  • word:[addr] read a WORD from addr.
  • dword:[addr] read a DWORD from addr.
  • qword:[addr] read a QWORD from addr (x64 only).

例如:  byte:[4D0000]

定位模块地址以urlmon.dll为例:

urlmon:0 等价于 urlmon.dll:0,   urlmon:base,  urlmon:imagebase, urlmon:header
都可以定位到模块的基地址.

定位到模块的RVA(例:10B80):

urlmon:0+10B80 或 urlmon:$10B80

定位到模块的文件偏移(例:10B80):

urlmon:#10B80

在以上模块定位中, 如果省略:前面的模块名, 则使用CPU窗口中当前选择的模块, 注意冒号不可以省略
以上的冒号也可以用 . 来代替

运算符与C语言中的使用一样, 特别的有
<<< 为循环左移, >>> 循环右移,
像 >= ,  == , !=  这类条件判断, 真返回1, 假返回0

条件断点示例:

$breakpointcounter==3 将在第三次命中时中断
tid()==1C0  仅当线程为1C0时中断

字符串格式:

基本语法是 {?:表达式}, 类型默认是x, 如果结果中要输出{或}, 请使用 {{ 或 }}
? 可以是以下类型:
d    有符号整数, 如: -3
u   无符号整数, 如: 57329171
p   0前缀对齐的指针, 如: 0000000410007683
s   字符串, 如: this is a string
x   16进制, 如: 3C28A
a   地址信息, 如: 00401010 <module.EntryPoint>
i   指令文本, 如: jmp 0x77ac3c87

复杂类型:

字符串类型
{utf16[;length]@address}
{utf8[;length]@address}
{ansi[;length]@address}
{ascii[;length]@address}
{modname@address} 打印指定地址模块名
{mem;size@address} 将以16进制打印从 address 开始大小为 size 字节的内容
示例:
enc:{mem;10@[esp+8]}
rax: {rax} 输出 rax: 4C76
password: {s:4*ecx+0x402000} 输出 password: L"s3cret"

字符串匹配
matchstr[A](rcx, s0:"textpattern")
matchstrW(rcx, s0:"textpattern")
匹配支持正则表达式,  多个断点同时使用时, pattern字符串可用范围为 s0-s9
不指明文本编码时, 默认为Ansi,  matchstr 等同于matchstrA

取API参数, arg.get(索引), 索引从0开始, 要求位置在API函数起始位置
命令在条件断点中的使用, 可以使用多个命令, 以;号分隔
如, 清空一块内存
memset [esp+4], 0, 10

转载请注明转自: 听风 , 本文固定链接: x64dbg 常用表达式