字符串格式化

本节说明内置于 x64dbg 中的简单字符串格式化工具。

基本语法为 {?:expression},其中 ?表达式的可选类型。若要在结果中输出 {},请使用 {{}} 进行转义。

类型

  • d 有符号进制数:-3

  • u 符号十进制数:57329171

  • p 零前缀指0000000410007683

  • s 符串指针:"this is a string"不推荐,请改用 {utf8@address}

  • x进制:3C28A(整数值默认格式)

  • a 址信息:00401010 <module.EntryPoint>

  • i 令文本:jmp 0x77ac3c87

  • f 单精度浮点数指针或寄存器:如果 10001234 是单精度浮点数 3.14 的地址,则 {f:10001234} 将输出 3.14。它也可以接受 XMM、YMM 和 ZMM 寄存器:{f:XMM0} 打印 XMM0 第 31:0 位的单精度浮点数,{f:YMM7[7]} 打印 YMM7 第 255:224 位的单精度浮点数。目前不支持 x87 寄存器。

  • F 双精度浮点数指针或寄存器:与 f 类似,只是数据被解释为双精度浮点数。它也可以接受 XMM、YMM 和 ZMM 寄存器:{F:YMM7[3]} 打印 YMM7 第 255:192 位的双精度浮点数。

注意:XMM、YMM 和 ZMM 寄存器只能与 f/F 浮点数类型一起使用。(问题 2826 链接了相关详细信息)

复杂类型

  • {mem;size@address} 将以十六进制格式打印从 address 开始的 size 字节。

  • {winerror@code} 将打印 Windows 错误码的名称(通过 GetLastError() 返回)及其描述(通过 FormatMessage)。它类似于 ErrLookup 工具。

  • {winerrorname@code} 仅打印 Windows 错误码的名称(通过 GetLastError() 返回)。

  • {ntstatus@code} 将打印 NTSTATUS 错误码的名称及其描述(通过 FormatMessage)。

  • {ntstatusname@code} 仅打印 NTSTATUS 错误码的名称。

  • {ascii[;length]@address} 将打印 address 处的 ASCII 字符串,可选 length(以字节为单位)。

  • {ansi[;length]@address} 将打印 address 处的 ANSI(本地代码页)字符串,可选 length(以字节为单位)。

  • {utf8[;length]@address} 将打印 address 处的 UTF-8 字符串,可选 length(以字节为单位)。

  • {utf16[;length]@address} 将打印 address 处的 UTF-16 字符串,可选 length(以字为单位)。

  • {disasm@address} 将打印 address 处的反汇编(等同于 {i:address})。

  • {modname@address} 将打印 address 处的模块名称。

  • {bswap[;size]@value} 将对 value 进行字节交换,指定 size(默认为指针大小)。

  • {label@address} 将打印 address 处的(自动)标签。

  • {comment@address} 将打印 address 处的(自动)注释。

示例

  • rax: {rax} 格式化为 rax: 4C76

  • password: {utf16@4*ecx+0x402000} 格式化为 password: s3cret

  • function type: {mem;1@[ebp]+0xa} 格式化为 function type: 01

  • {x:bswap(rax)} 其中 rax=0000000078D333E0 格式化为 E033D37800000000,这是因为 bswap 函数反转了十六进制值

  • {bswap;4@rax} 其中 rax=1122334455667788 格式化为 88776655

  • mnemonic: {dis.mnemonic(dis.sel())} 格式化为 mnemonic: push

  • return address: {a:[rsp]}格式化为00401010 <module.myfunction+N>`

日志记录

使用 log 命令时,应在格式字符串周围加上引号(log "{mem;8@rax}"),以避免与 ;(用于分隔两个命令)产生歧义。更多详情请参阅问题 #1931

插件

插件可以使用 _plugin_registerformatfunction 注册自定义字符串格式化函数。语法为 {type;arg1;arg2;argN@expression},其中 type 是注册函数的名称,argN 是任意字符串(这些字符串将作为参数传递给格式化函数),expression 是任意有效的表达式。