ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

x64dbg 类型标记命令详解:DataWord/dw —— 将地址处的数据标记为 Word(2 字节)类型

x64dbg 类型标记命令详解:DataWord/dw —— 将地址处的数据标记为 Word(2 字节)类型 x64dbg 类型标记命令详解DataWord/dw —— 将地址处的数据标记为 Word2 字节类型【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg导读DataWord别名dw是 x64dbg 调试器“类型标记”Types命令家族中的一员用于把指定地址处的内存数据标记为Word2 字节类型。该命令是逆向工程与恶意软件分析中整理内存布局、让反汇编/数据视图按语义正确解读数据的基础工具常与db、dd、dq等同类命令搭配使用。读完本文你将掌握dw的完整语法、参数行为、返回值约定并能从源码层面理解 x64dbg 编码映射EncodeMap系统如何记录与持久化这些类型标记。一、命令概览与定位DataWord/dw属于 x64dbg 命令行体系中的数据标记指令。它的作用非常聚焦将arg1指定的地址标记为 Word 类型即告诉调试器“这块内存存放的是 2 字节宽的 16 位数据单元”。在 命令类型文档索引 中DataWord与DataByte、DataDword、DataQword、DataTbyte、DataOword等一同归入“操作数据类型”的命令集合。其命令注册位于 x64dbg.cppdbgcmdnew(DataWord,dw, cbInstrDataWord, true); //mark as Word从注册代码可以看出命令全名DataWord同时注册了短别名dw两者等价对应的处理函数为cbInstrDataWord实现在 cmd-types.cpp第三个参数true表示该命令在调试会话中可用。典型使用场景在CPU 数据视图Dump中把一段内存按 2 字节粒度划分便于观察 16 位数值序列例如 UNICODE 字符、16 位字段结构配合脚本化分析批量标注数据结构中的 16 位成员修正反汇编/数据视图对某段数据的默认类型解读避免被误当作代码或其他宽度类型。二、命令语法与参数详解原文档给出了两个参数的完整定义下面结合源码逐一展开DataWord [arg1] [arg2] dw [arg1] [arg2]arg1要标记的地址arg1The address you want to mark.必填参数指定要标记的内存起始地址。该参数并非只能写裸数字地址x64dbg 的表达式系统会先对它求值——源码中通过valfromstring(argv[1], addr, false)完成解析见 cmd-types.cpp。因此你可以传入十六进制裸地址dw 0x401000寄存器表达式dw eax、dw cip带符号的地址表达式dw rva(0x1000)、dw dis.sel()标签或变量dw label_name注意若arg1无法被求值为合法地址命令会直接返回失败不会执行任何标记操作。arg2标记大小字节[arg2]Size (in bytes) to mark, when not set this defaults to 1.可选参数以字节为单位指定要标记的内存长度默认值为 1字节。源码中对应duint size 1; if(argc 3) if(!valfromstring(argv[2], size, false)) return false;这里argc 3意味着只有在确实提供了第二个参数时才覆盖默认值。默认值 1 是字节数而非 Word 的个数即dw 0x401000只标记起始地址那 1 个字节为 Word 类型若要标记 4 个字节两个连续的 Word应写作dw 0x401000, 4或dw 0x401000 4。三、返回值与结果变量This command does not set any result variables.DataWord/dw不会设置任何结果变量。这一点与sizeof、VisitType等会写$result的命令不同——例如 cmd-types.cpp 中SizeofType命令会执行varset($result, size, false)而dw不会。命令执行成功时返回true命令处理函数返回值为真并触发视图刷新详见下一节失败时返回false可能的原因包括缺少arg1参数数量不足IsArgumentsLessThan检查arg1表达式求值失败arg2若提供表达式求值失败底层EncodeMapSetType写入失败此时控制台会打印EncodeMapSetType failed...。四、源码级实现原理从命令到 EncodeMap理解dw的关键在于 x64dbg 的**编码映射EncodeMap**机制。所有 DataXxx 系列命令共享同一个通用处理函数cbInstrDataGenericcmd-types.cppcbInstrDataWord只是把enc_word枚举传入其中bool cbInstrDataWord(int argc, char* argv[]) { return cbInstrDataGeneric(enc_word, argc, argv); }cbInstrDataGeneric的核心流程如下参数校验与求值解析地址addr与大小size写入编码映射调用EncodeMapSetType(addr, size, type, created)将enc_word写入该地址区间刷新视图若该区域是首次创建created true执行DbgCmdExec(disasm dis.sel())让反汇编视图定位到当前选择否则调用GuiUpdateDisassemblyView()仅刷新反汇编视图。EncodeMapSetType 内部行为底层实现在 encodemap.cpp。要点包括通过EncodeMapGetorCreate获取必要时创建以内存页基址为 key 的编码映射段size std::min(map.size - offset, size)会裁剪超出映射段范围的请求长度对于enc_word这类非代码类型datasize 1条件不满足enc_word的datasize为 2走else分支先把区间填为enc_middle中间态再按类型宽度datasize步进写入类型标记for(auto i offset; i offset size; i datasize) map.data[i] (uint8_t)type;区间结束后的残余enc_middle会被回退为enc_unknown未知类型。Word 类型的字节宽度enc_word对应的宽度由GetEncodeTypeSize定义encodemap.cpp类型枚举宽度字节典型用途enc_byte18 位字节enc_word216 位字本文主题enc_dword432 位双字enc_fword648 位远指针enc_qword864 位四字enc_tbyte1080 位x87 长双精度/TBYTEenc_oword16128 位enc_mmword/enc_xmmword8 / 16MMX / SSE 寄存器宽度enc_ymmword32AVXenc_real4/enc_real8/enc_real104 / 8 / 10单/双/长双精度浮点enc_ascii/enc_unicode1 / 2ASCII / UTF-16 字符这也解释了为什么arg2的默认值是 1字节而不是 2底层按字节粒度管理标记区间步进宽度由类型自身决定。编码映射的持久化标记结果会保存在调试器的编码映射中并随数据库一同缓存EncodeMapCacheSave/EncodeMapCacheLoadencodemap.cpp以 JSON 形式序列化encmaps数据。这意味着你用dw标记的类型信息会在保存数据库dbsave后保留下来下次加载数据库时自动恢复。清空类型标记可使用DataUnknowndu命令或通过 DataUnknown.md 介绍的机制将区间重置为未知类型。五、实战示例假设调试一个加载到0x400000的 PE 文件需要把0x401000处的 8 字节按 4 个 Word 标记dw 0x401000 8效果等价于以 2 字节步进写入enc_word即 0x401000、0x401002、0x401004、0x401006 四处各 1 个 Word。其他实用写法dw eax ; 将 eax 指向的 1 字节标记为 Word dw dis.sel() 4 ; 将反汇编光标处 4 字节标记为 Word dw rva(0x2000) 2 ; 以 RVA 表达式定位地址并标记 2 字节配合脚本使用时可先赋值再标记var addr 0x401000 dw $addr 16注意标记操作对目标进程内存是“只读语义”的元数据写入不会修改目标进程的实际内存内容只是改变调试器对这些字节的类型解读。六、同类命令速查dw只是 DataXxx 系列中的一个。兄弟命令包括DataByte/db标记为 Byte1 字节DataWord/dw标记为 Word2 字节本文DataDword标记为 Dword4 字节DataQword标记为 Qword8 字节DataTbyte、DataOwordTbyte / OwordDataFloat、DataDouble、DataLongdouble浮点类型DataAscii、DataUnicode字符串类型DataCode标记为代码DataUnknown重置为未知DataJunk、DataMiddle垃圾/中间数据它们在汇编助记符层面也有对应关系datainst_helper.cpp中的指令映射表包含INSTRUCTION_ASSEMBLE_MAP(enc_word, dw)见 datainst_helper.cpp与 x86 汇编伪指令dwdefine word语义一致方便从汇编视角理解。这些命令全部共享cbInstrDataGeneric实现仅在传入的ENCODETYPE枚举上不同因此本节介绍的参数规则、默认值、返回值约定与实现原理对整族命令普遍适用。七、小结要点结论命令/别名DataWord/dw功能将地址处数据标记为 Word2 字节类型arg1必填起始地址支持表达式求值arg2可选标记字节数默认 1结果变量不设置任何结果变量实现cbInstrDataGeneric(enc_word, ...)→EncodeMapSetType持久化随数据库缓存EncodeMapCacheSave/Load保存/恢复dw命令虽小却是 x64dbg 类型标注体系的基石之一它让你以最直接的方式控制调试器对内存的解读粒度为后续的数据结构分析、脚本化逆向和数据库复用打下基础。掌握它以及整个 DataXxx 家族的通用参数语义即可举一反三地使用全部类型标记命令。延伸阅读类型命令索引完整类型操作命令清单DataByte/db1 字节标记参数语义与dw完全一致DataDword4 字节标记ParseTypes / LoadTypes从头文件/类型文件批量导入类型定义SizeofType查询类型大小唯一会写$result的类型命令之一相关实现源码cmd-types.cpp、encodemap.cpp、x64dbg.cpp【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表