字符串格式
本章节阐述了 x64dbg 中内置的简单字符串格式。
基本语法是 {?:expression}
,此处 ?
是表达式可选的类型。若要在结果中输出 {
或 }
,可将它们转义为 {{
或 }}
。
类型
d
带符号的十进制数:-3
u
无符号的十进制数:57329171
p
前缀带零的指针:0000000410007683
s
字符串指针:this is a string
x
十六进制:3C28A
(整数值的默认值)a
地址信息:00401010 <module.EntryPoint>
i
指令文本:jmp 0x77ac3c87
f
单精度浮点指针或寄存器: 如果10001234
是单个精度浮点数 3.14 的地址,则{f:10001234}
将打印3.14
。它还可以接受 XMM 和 YMM 寄存器:{f:XMM0}
在 XMM0 位 31:0 处打印单精度浮点数,{f:YMM7[7]}
在 YMM7 位 255:224 处打印单精度浮点数。目前不支持 x87 和 AVX-512 寄存器。F
双精度浮点指针或寄存器: 类似于f
,但数据被解释为双精度浮点数。它还可以接受 XMM 和 YMM 寄存器:{F:YMM7[3]}
在 YMM7 位 255:192 处打印双精度浮点数。
注意: XMM 和 YMM 寄存器只能与 f
/F
浮点类型一起使用。(第2826期链接到有关原因的详细信息)
复杂类型
{mem;size@address}
将开始在address
以十六进制显示size
个字节。{winerror@code}
将显示窗口错误代码的名称(用GetLastError()
返回)及其描述(用FormatMessage
)。它类似于 ErrLookup 实用程序。{ntstatus@code}
将显示 NTSTATUS 错误代码的名称及其描述(用FormatMessage
)。{ascii[;length]@address}
将在address
用可选的length
(以字节)显示 ASCII 字符串。{ansi[;length]@address}
将在address
用可选的length
(以字节)显示 ANSI 字符串。{utf8[;length]@address}
将在address
用可选的length
(以字节)显示 UTF-8 字符串。{utf16[;length]@address}
将在address
用可选的length
(以字)显示 UTF-16 字符串。{disasm@address}
将在address
显示反汇编(等于{i:address}
)。{modname@address}
将在address
显示模块名称。{bswap[;size]@value}
将字节交换value
为指定的size
(每个默认值的指针大小)。{label@address}
将打印 (自动)标签在address
。{comment@address}
将打印 (自动)注释在address
。
示例
rax: {rax}
格式为rax: 4C76
password: {s:4*ecx+0x402000}
格式为password: L"s3cret"
function type: {mem;1@[ebp]+0xa}
格式为function type: 01
{x:bswap(rax)}
在rax=0000000078D333E0
格式为E033D37800000000
因为 bswap fun 可以反转十六进制值{bswap;4@rax}
在rax=1122334455667788
格式为88776655
mnemonic: {dis.mnemonic(dis.sel())}
格式为mnemonic: push
日志记录
使用 log
命令时,应在格式字符串 (log "{mem;8@rax}"
) 周围加引号以免与 ;
(分隔两个命令的)混淆。更多详细资料请参见 https://github.com/x64dbg/x64dbg/issues/1931。
插件
插件可使用 _plugin_registerformatfunction
注册自定义字符串格式化函数。语法是 {type;arg1;arg2;argN@expression}
在此 type
是函数注册的名称,argN
是任何字符串(这些都作为参数传递给格式化函数),以及expression
是任何有效的表达。