多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

x64dbg 注释命令完整指南:commentset/cmt/cmtset 的语法、底层实现与实战用法

x64dbg 注释命令完整指南:commentset/cmt/cmtset 的语法、底层实现与实战用法 x64dbg 注释命令完整指南commentset/cmt/cmtset 的语法、底层实现与实战用法【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg导读commentset别名cmt、cmtset是 x64dbg 用户数据库中用于在指定地址上设置/编辑注释的核心命令。注释是逆向工程中标记函数入口、解密循环、可疑调用点最常用的持久化标注手段配合标签label、书签bookmark共同构成 x64dbg 的用户数据库体系。读完本文你将掌握该命令的完整语法、地址表达式写法、底层存储机制含 manual/auto 注释区分、关联命令家族删除/列出/清空以及脚本 API 与测试用例的验证方式。命令概览与语法该命令在 x64dbg 的命令注册表中定义如下见 src/dbg/x64dbg.cppdbgcmdnew(commentset,cmt,cmtset, cbInstrCommentSet, true); //set/edit comment命令名commentset同时支持两个短别名cmt与cmtset三者完全等价。参数arguments参数含义是否必填arg1要设置注释的地址最好位于模块内部必填arg2注释文本内容必填结果result该命令不设置任何结果变量即执行后$result保持不变。参数详解与实战示例arg1地址表达式arg1并不是一个裸的十六进制字面量它支持 x64dbg 完整的表达式求值系统。在命令处理器中参数通过valfromstring(argv[1], addr, false)解析见 src/dbg/commands/cmd-user-database.cpp这意味着你可以传入直接地址commentset 00401000, entry point表达式commentset eip, current instruction符号/标签commentset MessageBoxW, API hook target模块内地址表达式commentset ntdll:7C921000, LdrLoadDll call推荐将地址定位在模块内部这样注释会随模块基址重定位逻辑正确保存与恢复跨模块的裸地址注释在下次加载、基址变化时可能失效。arg2注释文本与两个隐藏规则arg2是注释文本底层实现见 src/dbg/comment.cpp对文本有两个关键约束空字符串即删除如果传入的文本以\0开头空文本CommentSet不会写入注释而是直接调用CommentDelete删除该地址的已有注释。这与执行commentdel的效果一致。长度上限 512 字节文本长度必须小于MAX_COMMENT_SIZE - 1即最多 511 个有效字符。MAX_COMMENT_SIZE在 src/bridge/bridgemain.h 中定义为512。超长文本会被拒绝命令返回 Error setting comment。首字符保留以 ASCII\10x01开头的文本被禁止因为该前缀在内部用于标记自动注释见下文 manual/auto 区分用户文本不得占用。另外注意命令行的参数分割以空格为界含空格的注释文本建议用双引号包裹commentset 00401000, decrypt loop start。底层实现解析从命令到存储命令分发链路整条调用链为命令行输入 commentset → cbInstrCommentSet命令处理器 → valfromstring 解析地址表达式 → CommentSet(addr, text, true)注释核心逻辑 → GuiUpdateAllViews()刷新所有视图cbInstrCommentSet的实现位于 src/dbg/commands/cmd-user-database.cpp先检查参数数量少于 3 个直接失败再解析地址成功后调用CommentSet并刷新 GUI 视图失败则输出 Error setting comment。注意第三个参数传的是true即Manual标志——通过命令行设置的注释都是手动注释manual。CommentSet 的核心逻辑src/dbg/comment.cpp 中的CommentSet负责将注释写入内存中的Comments哈希表AddrInfoHashMap并为每条记录填充地址、模块哈希、manual 标志与文本bool CommentSet(duint Address, const char* Text, bool Manual) { if(!Text || Text[0] \1 || strlen(Text) MAX_COMMENT_SIZE - 1) return false; if(Text[0] \0) { CommentDelete(Address); return true; } COMMENTSINFO comment; if(!comments.PrepareValue(comment, Address, Manual)) return false; comment.text Text; return comments.Add(comment); }每条注释通过Comments::VaKey(Address)以虚拟地址为键进行索引COMMENTSINFO结构见 src/dbg/comment.h包含继承自AddrInfo的模块哈希、manual 标志以及注释文本text。manual 与 auto 注释的区分x64dbg 的注释体系分为两类手动注释manual由commentset命令或 GUI 右键菜单创建持久保存并显示在反汇编视图中自动注释auto由引擎/插件内部生成例如cmd-undocumented.cpp中为RUNTIME_FUNCTION生成的自动标注见 src/dbg/commands/cmd-undocumented.cpp此时CommentSet的Manual参数传false。两者的读取差异体现在CommentGet中src/dbg/comment.cpp手动注释原样返回自动注释则会被加上\1前缀便于上层区分来源。在commentlist中也可以通过额外参数1选择是否同时列出自动注释。持久化与数据库回调注释属于用户数据库的一部分随数据库保存/加载序列化键名为comments见 src/dbg/comment.cpp 的jsonKey()通过CommentCacheSave/CommentCacheLoad在dbsave/dbload时写入或读回每条记录写入数据库操作时标记为DbItemTypeCommentsrc/dbg/comment.cpp因此注释的增删会触发数据库回调database callbacks供插件与自动化测试监听。关联命令家族commentset不是孤立命令它与另外三个注释命令共同构成完整的注释管理工具集均在 src/dbg/x64dbg.cpp 注册命令别名功能commentsetcmt、cmtset设置/编辑注释commentdelcmtc、cmtdel删除指定地址的注释commentlist无在 Reference View 中列出注释$result返回条数commentclear无清空所有模块的全部注释其中commentlist的结果可通过脚本配合ref.addr(i)、ref.count()等表达式函数遍历见 commentlist 文档 与 表达式函数。在 GUI 侧反汇编视图CPU 视图会在指令行右侧直接显示注释文本且手动注释会随数据库持久化设置注释后GuiUpdateAllViews()会即时刷新所有相关视图。脚本与插件 API除命令行外脚本与插件可以通过导出 API 完成相同操作脚本 APIScript::Comment::Set(addr, text, manual)、Script::Comment::Get(addr, text)、Script::Comment::Delete(addr)实现在 src/dbg/_scriptapi_comment.cppSet还提供基于CommentInfo的重载传入模块名与 RVA自动换算为模块基址 RVA 的绝对地址后再写入适合插件按模块 偏移的稳定坐标管理注释。测试用例验证仓库中的数据库回调测试对注释的写入/删除做了端到端验证见 src/tests/database_callbacks/test.comment-single.txtinit tests/database_callbacks.exe _c1 database_callbacks:VariableTarget commentset _c1, test assertlastop mod.hash(mod.base(_c1)), (_c1-mod.base(_c1)), c, a, 0, test commentdel _c1 assertlastop mod.hash(mod.base(_c1)), (_c1-mod.base(_c1)), c, r, 0该用例揭示了两个实用要点地址可以传标签/符号database_callbacks:VariableTarget印证了 arg1 的表达式能力注释写入与删除都会触发数据库回调assertlastop校验操作码a/r回调参数中携带模块哈希、RVA 与注释文本——这正是插件监听用户数据库变更的标准通道。实践建议与注意事项用模块内地址将注释设置在模块内部配合dbsave保存数据库后下次调试同一模块时注释可正确恢复配合标签使用先labelset命名关键位置再用commentset补充说明可读性最佳注意文本长度单条注释不要超过 511 字节超长文本会被静默拒绝并报错区分自动注释commentlist默认只列手动注释排查异常时可追加参数查看自动注释避免与引擎生成的RUNTIME_FUNCTION等自动标注混淆空文本即删除commentset addr, 与commentdel addr等价可用于脚本中条件化地清理注释。相关命令的完整文档可在 user-database 命令索引 中查阅用户数据库的批量管理保存/加载/清空参见 dbsave、dbload 与 dbclear。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表