尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

x64dbg labellist 命令详解:在 Reference View 中列出并遍历用户自定义标签

x64dbg labellist 命令详解:在 Reference View 中列出并遍历用户自定义标签 x64dbg labellist 命令详解在 Reference View 中列出并遍历用户自定义标签【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbglabellist是 x64dbg 用户数据库user database命令族中的核心查询命令用于把当前调试会话中全部用户自定义标签label以表格形式填充到 Reference View引用视图并返回标签总数。本文以 labellist 官方文档 为骨架结合 cmd-user-database.cpp 与 label.cpp 的源码实现完整讲解命令的语法、结果语义、Reference View 列结构以及如何借助ref.addr()等表达式函数在脚本中遍历标签列表实现批量定位、批量删除等实战操作。命令概述与适用场景labellist是 x64dbg 用户数据库四大操作设置labelset、删除labeldel、列表labellist、清空labelclear中的查询环节见 user-database 命令索引。标签本身是用户在任意地址上命名的助记文本可通过 labelset 设置并支持 String Formatting常用于标注关键函数、数据块或可疑调用点。典型使用场景包括逆向分析过程中集中查看当前已标注的所有地址快速核对命名是否完整在脚本中遍历所有标签批量生成日志、批量跳转或批量删除将标签列表导出到 Reference View 后借助视图自带的Delete右键/菜单命令直接删除某一行对应的标签。labellist命令不带任何参数其行为由源码cbInstrLabelListcmd-user-database.cpp完全确定。语法与参数labellist的语法极其简单没有任何可选或必选参数labellist这也是 labellist.md 中 This command has no arguments. 的含义命令解析器不会读取argv[1]之后的任何内容因此直接执行即可。作为对比同族的labelset需要两个参数地址 标签文本labeldel需要一个参数地址而labellist与labelclear一样属于无参命令。执行结果与 Reference View 填充结果变量$result命令执行后$result变量会被设置为当前用户自定义标签的数量即填充进 Reference View 的总行数这是脚本自动化中最重要的返回值$result 标签总数对应源码位于 cmd-user-database.cppvarset($result, count, false);。脚本可通过$result判断是否存在标签0 表示没有以及决定后续遍历次数。Reference View 的三列结构cbInstrLabelList首先初始化 Reference View并依次添加三列cmd-user-database.cpp列列宽列头内容来源第 0 列2 * sizeof(duint)即一个指针宽度32 位下 8 字符、64 位下 16 字符Address标签所在绝对地址%p格式化第 1 列50Disassembly该地址处的反汇编文本GuiGetDisassembly第 2 列0自动扩展Label用户自定义的标签文本每一行依次通过GuiReferenceSetRowCount/GuiReferenceSetCellContent写入最终调用GuiReferenceReloadData()刷新视图cmd-user-database.cpp。命令结束后控制台输出统计信息%d label(s) listed in Reference View。地址的模块基址还原源码中有一个容易被忽略的细节标签内部以模块哈希 模块内偏移的方式存储因此在填充视图前需要还原为绝对地址labels[i].addr ModBaseFromName(labels[i].mod().c_str());见 cmd-user-database.cpp。也就是说Reference View 中展示的 Address 是可直接用于跳转、下断点或计算偏移的绝对虚拟地址而不是模块内偏移。无标签时的行为如果当前没有用户自定义标签命令不会报错而是输出No labels并在 Reference View 中保持空表cmd-user-database.cpp此时$result为 0。标签数据的底层来源Reference View 中展示的标签来自LabelGetListlabel.cpp其数据包含两部分持久化标签通过labels.GetList(list)从标签哈希表Labels基于AddrInfoHashMap取出这些标签保存在用户数据库database中可随dbsave持久化、随dbload恢复临时标签tempLabels中的标签也被并入结果且manual标记为falselabel.cpp用于表示非手动命名如自动/临时标注的标签。因此labellist列出的并非只有手动labelset设置的标签还包括临时标签这一行为与同文件的CommentListcbInstrCommentList支持1参数筛选 manual略有差异——cbInstrLabelList不提供参数始终列出全部标签。脚本遍历结合 ref 表达式函数Reference View 的内容可以在脚本中通过 ref 表达式函数 迭代ref.count()当前 Reference View 中的条目总数ref.addr(index)返回第index条引用对应的地址失败返回 0。labellist官方文档给出了一个完整的遍历脚本它打印每条引用的序号与地址i 0 loop: addr ref.addr(i) log reference {d:i} {p:addr} i cmp i, ref.count() jne loop脚本逻辑解析i 0初始化索引进入loop标签addr ref.addr(i)取出第i条引用的绝对地址log reference {d:i} {p:addr}使用 String Formatting 的{d:...}十进制与{p:...}指针/十六进制地址格式化输出i后与ref.count()比较jne loop直到遍历完毕。由于labellist执行后$result等于标签数、Reference View 行数也等于标签数ref.count()与$result在此场景下等价两者都可以作为循环上界。遍历得到的addr是绝对地址可直接用于后续labeldel addr、bp addr等操作。与其他用户数据库命令的配合labellist通常与以下命令组合使用形成完整的标签管理闭环命令作用文档labelset addr text/lbl/lblset在指定地址设置标签labelset.mdlabeldel addr/lblc/lbldel删除指定地址的标签labeldel.mdlabellist列出全部标签到 Reference Viewlabellist.mdlabelclear清空所有模块的全部标签labelclear.md此外Reference View 顶部会注册一个 Delete 命令源码GuiReferenceAddCommand(..., labeldel $0)见 cmd-user-database.cpp即视图内选中某一行执行 Delete 时实际调用labeldel 该行地址实现可视化逐条删除标签。实战示例示例 1查看标签总量并输出到日志labellist log total labels: {d:$result}示例 2遍历所有标签地址并跳转检查labellist i 0 loop: cmp i, ref.count() jae done addr ref.addr(i) disasm $result ; 跳转到该地址查看反汇编 log checking {p:addr} i jmp loop done:示例 3批量删除 Reference View 中的全部标签labellist i 0 loop: cmp i, ref.count() jae done addr ref.addr(i) labeldel addr i jmp loop done: log removed {d:$result} labels注意示例脚本中jae无符号大于等于跳转用于保护性循环边界避免ref.addr越界具体跳转助记符需与 x64dbg 脚本语言的比较/跳转语义配合使用参考 script 命令文档。小结labellist虽然是一个零参数命令但其价值在于把散落在用户数据库中的标签统一汇入 Reference View并通过$result与ref.addr(i)/ref.count()打通脚本自动化链路。理解其实现标签的模块基址还原、持久化与临时标签合并、视图三列结构有助于在大型逆向工程与恶意样本分析任务中高效组织标注信息配合labelset、labeldel、labelclear形成完整的标签生命周期管理方案。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表