字符串格式
本章节阐述了 x64dbg 中内置的简单字符串格式。
基本语法是 {?:expression},此处 ? 是表达式可选的类型。若要在结果中输出 { 或 },可将它们转义为 {{ 或 }}。
类型
d带符号的十进制数:-3u无符号的十进制数:57329171p前缀带零的指针:0000000410007683s字符串指针:this is a stringx十六进制:3C28A(整数值的默认值)a地址信息:00401010 <module.EntryPoint>i指令文本:jmp 0x77ac3c87f单精度浮点指针或寄存器: 如果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: 4C76password: {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格式为88776655mnemonic: {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 是任何有效的表达。