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

文章详情

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

x64dbg 命令详解:SetExceptionBreakpointName——为异常断点设置自定义名称

x64dbg 命令详解:SetExceptionBreakpointName——为异常断点设置自定义名称 x64dbg 命令详解SetExceptionBreakpointName——为异常断点设置自定义名称【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg导读SetExceptionBreakpointName是 x64dbg 调试器面向 Windows 逆向工程与恶意软件分析的开源用户态调试器中用于为**异常断点Exception Breakpoint**设置自定义名称的命令。命名后的断点其名称会显示在断点视图Breakpoints view中并在断点被命中时同步出现在日志Log输出里极大方便多断点场景下的识别与脚本化管理。阅读本文后你将掌握该命令的完整语法、参数解析规则、底层调用链与 GUI 集成机制并能在脚本与插件开发中熟练运用。命令概述异常断点由SetExceptionBPX命令创建用于捕获指定异常码的首选first-chance或次选second-chance异常事件。而SetExceptionBreakpointName负责为这类断点赋予一个人类可读的名称该名称会显示在断点视图中帮助开发者快速区分多个异常断点当断点命中时该名称会出现在日志输出中便于追溯触发来源。这一能力与普通断点命名SetBreakpointName、硬件断点命名SetHardwareBreakpointName、内存断点命名SetMemoryBreakpointName以及 DLL 断点命名SetLibrarianBreakpointName同属一个命令家族共享同一套底层实现详见后文源码级原理一节。命令语法与参数SetExceptionBreakpointName arg1 [, arg2]参数说明参数含义是否必填默认值arg1异常断点的名称、异常名称或异常代码用于定位目标断点必填无arg2要为断点设置的新名称不指定时置为空字符串可选空empty两个参数均支持使用引号包裹以处理包含空格或特殊字符的名称。参数解析规则arg1 如何定位断点arg1不是简单的名字参数命令会按照三级查找顺序解析它对应源码src/dbg/breakpoint.cpp中BpGetAny的实现见 breakpoint.cpp按断点名称精确匹配调用BpGet在断点表中做大小写不敏感_stricmp的名称比对见 breakpoint.cpp。这是最常用的方式——先用SetExceptionBreakpointName命名的断点之后可直接用该名称再次引用。按表达式/地址解析若名称匹配失败尝试用valfromstring把arg1当作表达式或地址解析再按解析出的地址查找异常断点。按异常名称转码若断点类型为BPEXCEPTION会调用ExceptionNameToCode将arg1解释为异常名称如EXCEPTION_ACCESS_VIOLATION并转换为异常码再按该异常码匹配断点见 breakpoint.cpp。也就是说arg1传已命名的断点名、异常名或异常码三种形式均可命中同一个断点这使命令在脚本中可以灵活地以任意一种身份引用断点。结果与错误处理结果变量本命令不设置任何结果变量如$result调用成功后仅刷新断点视图。参数不足缺少arg1时命令直接失败返回。断点不存在若arg1无法命中任何异常断点命令会向日志输出错误信息No such breakpoint ...并返回失败。设置失败若底层写入名称失败例如断点信息在并发中已被移除输出Cant set breakpoint name on breakpoint ...。源码级原理完整调用链1. 命令注册命令在调试器初始化时注册于 x64dbg.cppdbgcmdnew(SetExceptionBreakpointName, cbDebugSetBPXExceptionName, true); //set breakpoint name最后一个布尔参数表示该命令仅用于调试会话中命令执行需要调试器处于运行状态。2. 命令回调回调函数位于 cmd-conditional-breakpoint-control.cpp它直接将断点类型固定为BPEXCEPTION并转交公共处理函数bool cbDebugSetBPXExceptionName(int argc, char* argv[]) { return cbDebugSetBPXNameCommon(BPEXCEPTION, argc, argv); }3. 公共文本设置框架cbDebugSetBPXNameCommon与cbDebugSetBPXConditionCommon、cbDebugSetBPXLogCommon等共享同一个泛化框架cbDebugSetBPXTextCommon见 cmd-conditional-breakpoint-control.cppstatic bool cbDebugSetBPXTextCommon(BP_TYPE Type, int argc, char* argv[], const String description, const std::functionbool(duint, BP_TYPE, const char*) setFunction) { BREAKPOINT bp; if(IsArgumentsLessThan(argc, 2)) return false; const char* value ; if(argc 2) value argv[2]; if(!BpGetAny(Type, argv[1], bp)) { dprintf(QT_TRANSLATE_NOOP(DBG, No such breakpoint \%s\\n), argv[1]); return false; } if(!setFunction(bp.addr, Type, value)) { dprintf(QT_TRANSLATE_NOOP(DBG, Cant set %s on breakpoint \%s\\n), description.c_str(), argv[1]); return false; } DebugUpdateBreakpointsViewAsync(); return true; }从该实现可以提炼出几个关键行为argc 2即参数不足直接失败——这对应文档中arg1为必填argc 2时才读取arg2否则value默认为空字符串——这对应文档中arg2不指定即为空先查断点BpGetAny后写属性BpSetName确保不会对不存在的断点误操作成功写入后调用DebugUpdateBreakpointsViewAsync()异步刷新断点视图保证 GUI 立即反映新名称。4. 名称写入最终写入动作落到 breakpoint.cpp 的BpSetNamebool BpSetName(duint Address, BP_TYPE Type, const char* Name) { ASSERT_DEBUGGING(Future(?): This is not used anywhere); EXCLUSIVE_ACQUIRE(LockBreakpoints); // If a name wasnt supplied, set to nothing if(!Name) Name ; BREAKPOINT* bpInfo BpInfoFromAddr(Type, Address); if(!bpInfo) return false; bpInfo-name Name; return true; }注意BpSetName通过持有断点表互斥锁EXCLUSIVE_ACQUIRE(LockBreakpoints)保证并发安全nullptr名称会被归一化为空串。另外该函数注释标明此函数当前未被外部直接调用——即日常命名操作均经由命令层完成这正是命令封装的价值所在。GUI 集成断点视图如何应用名称SetExceptionBreakpointName不仅是命令行工具也是GUI 断点窗口保存逻辑的底层支撑。在 Breakpoints.cpp 中当用户在断点视图中编辑异常断点的名称字段并保存时GUI 会生成并执行等价的命令case bp_exception: exec(QString(SetExceptionBreakpointName %1, \%2\).arg(addrText).arg(DbgCmdEscape(bp.name))); // ... 其余属性条件、日志、命令等同理 break;可以看到 GUI 传参顺序与命令行完全一致arg1是断点标识此处为地址文本arg2是经DbgCmdEscape转义后的名称。这意味着你既可以在命令行/脚本中设置名称也可以直接在 GUI 断点窗口中修改两者最终殊途同归。实战示例示例 1创建异常断点并命名SetExceptionBPX EXCEPTION_ACCESS_VIOLATION, first SetExceptionBreakpointName EXCEPTION_ACCESS_VIOLATION, AV on first chance第一行用异常名创建一个首选异常断点first/1表示捕获 first-chance 异常second/2捕获 second-chanceall/3捕获全部默认first详见 SetExceptionBPX第二行以异常名arg1定位该断点并命名为AV on first chance。示例 2按名称二次引用SetExceptionBreakpointName AV on first chance, AV primary命名后后续命令可以直接用断点名称作为arg1再次引用它名称匹配大小写不敏感也可以继续通过异常码引用SetExceptionBreakpointName 0xC0000005, AV final name示例 3清空名称SetExceptionBreakpointName 0xC0000005省略arg2即可把断点名称置为空恢复默认显示异常码/名称。示例 4结合 bplist 验证使用 bplist 命令列出全部断点即可在输出中核对异常断点的名称是否已生效断点命中时日志也会以该名称标识对应事件。使用注意事项仅作用于异常断点该命令对普通、硬件、内存、DLL 断点无效对应命名的命令请分别使用SetBreakpointName、SetHardwareBreakpointName、SetMemoryBreakpointName、SetLibrarianBreakpointName完整命令清单见 conditional-breakpoint-control/index.rst。断点必须先存在arg1必须能命中一个已创建的异常断点否则命令报No such breakpoint失败。请先用SetExceptionBPX创建断点。名称在调试会话内维护断点名称作为断点属性随断点数据库持久化见 breakpoint.cpp 的 JSON 序列化字段name重新加载数据库后名称仍然保留。命名空间隔离arg1名称匹配是大小写不敏感的命名时避免与其他断点名称冲突否则查找可能命中非预期断点。调试器运行环境命令注册标记为仅调试会话有效请确保调试会话处于活动状态时执行。延伸阅读异常断点的创建与参数chance 语义SetExceptionBPX条件断点机制的完整介绍ConditionalBreakpoint断点列表与状态查看bplist同族命名命令与条件控制命令清单conditional-breakpoint-control/index.rst底层断点数据结构与序列化逻辑breakpoint.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),仅供参考
返回列表