字符串格式化
本节说明内置于 x64dbg 中的简单字符串格式化工具。
基本语法为 {?:expression},其中 ? 是表达式的可选类型。若要在结果中输出 { 或 },请使用 {{ 或 }} 进行转义。
类型
d有符号十进制数:-3u无符号十进制数:57329171p零前缀指针:0000000410007683s字符串指针:"this is a string"(不推荐,请改用{utf8@address})x十六进制:3C28A(整数值默认格式)a地址信息:00401010 <module.EntryPoint>i指令文本:jmp 0x77ac3c87f单精度浮点数指针或寄存器:如果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: 4C76password: {utf16@4*ecx+0x402000}格式化为password: s3cretfunction type: {mem;1@[ebp]+0xa}格式化为function type: 01{x:bswap(rax)}其中rax=0000000078D333E0格式化为E033D37800000000,这是因为 bswap 函数反转了十六进制值{bswap;4@rax}其中rax=1122334455667788格式化为88776655mnemonic: {dis.mnemonic(dis.sel())}格式化为mnemonic: pushreturn address:{a:[rsp]}格式化为00401010 <module.myfunction+N>`
日志记录
使用 log 命令时,应在格式字符串周围加上引号(log "{mem;8@rax}"),以避免与 ;(用于分隔两个命令)产生歧义。更多详情请参阅问题 #1931。
插件
插件可以使用 _plugin_registerformatfunction 注册自定义字符串格式化函数。语法为 {type;arg1;arg2;argN@expression},其中 type 是注册函数的名称,argN 是任意字符串(这些字符串将作为参数传递给格式化函数),expression 是任意有效的表达式。