尧图精选

x64dbg 内存范围断点 SetMemoryRangeBPX(bpmrange)完全指南:GUARD_PAGE 精确范围监控与实战

🕒 发布时间:2026/9/20 0:42:20 📁 来源:尧图网络
逆向工程调试器开发工具应用安全【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址https://gitcode.com/gh_mirrors/x6/x64dbg点击查看免费下载导读SetMemoryRangeBPX别名memrangebp、bpmrange是 x64dbg 调试器中用于在指定内存范围上设置内存断点基于 Windows GUARD_PAGE 机制的命令。与单地址断点SetMemoryBPX不同它允许你精确指定start起始地址与size大小从而监控一段确定长度的内存区域是逆向工程与恶意软件分析中追踪缓冲区读写、结构体字段访问、堆区操作的高频工具。读完本文你将掌握该命令的完整参数语义、与底层SetMemoryBPXEx的调用链关系、单发singleshot用法以及如何借助仓库中的回归测试验证其行为。一、命令速览与注册方式SetMemoryRangeBPX在命令系统中以三个别名同时注册均可直接使用别名说明SetMemoryRangeBPX完整命令名memrangebp简写bpmrange常用简写测试脚本中大量使用命令注册位于 src/dbg/x64dbg.cppdbgcmdnew(SetMemoryRangeBPX,memrangebp,bpmrange, cbDebugSetMemoryRangeBpx, true); // SetMemoryRangeBpx注册标志为true表示该命令属于“需要调试会话”的命令类别即只有在调试器已经初始化加载或附加目标进程后才能调用。这与文档中result一节所述该命令不设置任何结果变量一致——它的行为完全通过断点副作用体现不会向$result等变量写入值。二、参数详解命令完整语法为bpmrange start, size[, type]1.start内存范围的起始地址范围起始地址支持 x64dbg 表达式解析源码中通过valfromstring(argv[1], start, false)解析见 cmd-breakpoint-control.cpp因此可以传入十六进制地址如0x401000符号表达式如membp:ReadTarget模块名:符号名形式测试脚本中大量使用2.size内存范围的大小从start开始的字节数同样经valfromstring解析支持十六进制0x100或十进制256。范围可以跨页如 4KB 边界可以覆盖多个页甚至可以覆盖大型区域测试中覆盖到 32K 页规模详见下文测试章节。3.[type]断点类型可选默认a类型值含义底层 TitanEngine 类型a默认读 写 执行全访问UE_MEMORYr读UE_MEMORY_READw写UE_MEMORY_WRITEx执行UE_MEMORY_EXECUTE类型解析在 cmd-breakpoint-control.cpp 中实现TitanMemoryBreakpointType type UE_MEMORY; bool singleshot false; if(argc 3) { switch(argv[3][0]) { case a: //readwriteexecute type UE_MEMORY; break; case r: //read type UE_MEMORY_READ; break; case w: //write type UE_MEMORY_WRITE; break; case x: //execute type UE_MEMORY_EXECUTE; break; default: dputs(QT_TRANSLATE_NOOP(DBG, Invalid type specified!)); return false; } singleshot strstr(argv[3], ss) ! nullptr; }注意两个细节类型仅取第一个字符判定非法类型直接输出Invalid type specified!并返回失败singleshot通过strstr(argv[3], ss)检测即只要类型字符串中包含ss子串即视为单发断点。4.ss后缀单发singleshot断点在类型参数后追加ss即设置单发断点例如bpmrange 0x401000, 0x100, rss读单发断点bpmrange 0x401000, 0x100, wss写单发断点bpmrange 0x401000, 0x100, ss全访问单发断点类型默认为a单发断点在首次命中后自动移除适合一次性观察某个内存访问事件。等效的脚本 API 是 SetMemoryBreakpointSingleshoot。三、底层实现从命令到 GUARD_PAGE命令处理器cbDebugSetMemoryRangeBpxcmd-breakpoint-control.cpp的完整执行流程如下参数解析解析start与size解析类型与单发标志冲突检查调用BpGet(start, BPMEMORY, 0, bp)检查该地址是否已存在内存断点若已存在且被禁用则执行bpme addr直接将其重新启用若已存在且启用则输出Memory breakpoint already set!并直接返回避免重复设置登记断点调用BpNew(start, true, singleshot, 0, BPMEMORY, type, 0, size)在断点数据库中登记memsize字段保存范围大小供后续删除/重启用下发底层引擎调用SetMemoryBPXEx(start, size, type, !singleshot, cbMemoryBreakpoint)真正设置 GUARD_PAGE刷新界面GuiUpdateAllViews()更新所有视图。其中第 4 步是核心SetMemoryBPXEx的声明位于 src/dbg/TitanEngine/TitanEngine.h__declspec(dllexport) bool SetMemoryBPXEx(ULONG_PTR MemoryStart, SIZE_T SizeOfMemory, TitanMemoryBreakpointType BreakPointType, bool RestoreOnHit, TITANCBMEMBP bpxCallBack);其参数与命令参数的对应关系为MemoryStart←startSizeOfMemory←size这是与 SetMemoryBPX 的本质区别见下文对比BreakPointType←typeRestoreOnHit←!singleshot命中后是否恢复断点bpxCallBack←cbMemoryBreakpoint统一的内存断点回调负责将底层命中事件转交给断点数据库与 GUI当断点命中并需要后续处理时删除或禁用操作会通过RemoveMemoryBPX撤销 GUARD_PAGE 设置例如 cmd-breakpoint-control.cpp 中批量删除内存断点时的处理。整个断点生命周期设置 → 命中 → 删除/禁用/重启用统一由 src/dbg/breakpoint.cpp 中的数据库逻辑管理memsize字段在其中被持续传递以保证底层引擎与数据库状态一致。四、与 SetMemoryBPXmembp的关键区别仓库 src/tests/membp/README.md 明确指出了二者的行为差异SetMemoryBPX/membpis documented to watch the whole memory region containing the supplied address... The same fixture is therefore reused forbpmrangeexact-range install/hit/lifecycle regression tests.命令监控范围适用场景SetMemoryBPX/membp自动扩展为包含指定地址的整个内存区域通过MemFindBaseAddr计算基址与大小只需关注某地址所在区域时SetMemoryRangeBPX/bpmrange精确指定的范围start起size字节需要精确限制监控范围、避免同区域内无关访问误触发时对比实现可见 cbDebugSetMemoryBpx 中membp会先执行MemFindBaseAddr(addr, size, true)计算区域范围而bpmrange直接使用用户提供的start/size。因此当目标内存区域很大、而你只关心其中一小段时bpmrange能显著减少误命中这是它作为“范围断点”的核心价值。五、实战示例以下命令均可在 x64dbg 的命令栏或脚本中直接执行; 在 0x00401000 起的 256 字节范围上设置读写执行全监控 bpmrange 0x00401000, 0x100 ; 只监控 0x00401000 起的 256 字节范围的读访问 bpmrange 0x00401000, 0x100, r ; 监控写访问命中一次后自动移除 bpmrange 0x00401000, 0x100, wss ; 使用符号表达式指定起点模块:符号 形式 bpmrange membp:WriteTarget, 1, w ; 跨页范围监控 8KB两页范围 bpmrange 0x00401000, 0x2000, a ; 使用完整命令名或 memrangebp 别名效果相同 SetMemoryRangeBPX 0x00401000, 0x100, x memrangebp 0x00401000, 0x100, r与内存断点配套的常用操作bplist列出所有断点见 bplistDeleteMemoryBPX/DisableMemoryBPX/EnableMemoryBPX删除、禁用、启用内存断点见 DeleteMemoryBPX、EnableMemoryBPX若想为断点附加命令、日志、条件参见 SetMemoryBreakpointCommand 与 SetMemoryBreakpointCondition 等系列命令。六、回归测试与行为验证仓库在 src/tests/membp 目录下提供了覆盖bpmrange完整行为矩阵的回归测试夹具与脚本由 src/tests/run.py 驱动测试目标进程membp.exe将代码与数据合并进同一连续区域便于构造精确范围场景。相关测试脚本包括基础范围与访问类型test.range-read.txt、test.range-write.txt、test.range-execute.txt、test.range-access-read.txt等类型隔离test.range-read-ignore-write.txt、test.range-write-ignore-read.txt、test.range-execute-ignore-write.txt、test.range-shared-boundary-type-isolation.txt等验证只读断点不拦截写访问等重复命中与单发test.range-repeat-read.txt、test.range-singleshot-read.txt、test.range-singleshot-execute.txt跨页与相邻分配test.range-cross-page-read.txt、test.range-cross-page-write.txt、test.range-three-page-read.txt、test.range-adjacent-allocations.txt、test.range-large-32k-pages.txt生命周期test.range-delete.txt、test.range-reenable.txt、test.range-reinit.txt、test.range-callback-add.txt、test.range-callback-delete.txt多线程与压力test.range-multithread-read.txt、test.range-stress-access.txt、test.range-heap.txt。以最基本的 test.range-read.txt 为例settingset Events, EntryBreakpoint, 0 init tests/membp.exe mbreset cipmembp:ReadSequence bpmrange membp:ReadTarget, 1, r mbassertexact membp:ReadTarget, 1 run mbasserthit membp:ReadTarget脚本展示了典型流程初始化目标 → 用bpmrange设置 1 字节读断点 →mbassertexact校验断点安装元数据地址、大小、类型、单发标志→run触发 →mbasserthit校验命中。再看单发场景 test.range-singleshot-read.txtbpmrange membp:ReadTarget, 1, rss mbassertinfo membp:ReadTarget, 1, r, 1, 1 run mbassertseq membp:ReadTarget mbassertabsent membp:ReadTarget run mbassertcount 1 mbassertexit 0x1FE这里用rss设置单发读断点命中一次后mbassertabsent确认断点已被自动移除最终mbassertcount 1验证整个会话只命中一次——这正是ss单发语义的自动化佐证。该测试夹具同时被文档化行为测试membp与bpmrange回归测试共用插件 plugin.cpp 提供安装元数据、命中序列、删除/重启用、回调变更、退出校验等共享断言。七、使用注意事项必须处于调试会话中该命令注册时标记为调试会话内命令未加载/附加目标时调用会失败地址冲突处理若目标地址已存在启用的内存断点命令会提示Memory breakpoint already set!并跳过若存在但被禁用则直接重新启用GUARD_PAGE 语义内存断点基于页保护机制实现命中行为受页粒度与系统保护语义影响跨页大范围断点会作用于所覆盖的多个页测试已覆盖跨页、32K 页等极端场景无结果变量命令不设置任何结果变量判断成功与否应观察日志输出成功打印Memory breakpoint at %p[%p] set!或使用bplist验证与脚本 API 的对应需要从脚本/插件侧实现等效功能时可参考 SetMemoryBreakpointSingleshoot 与相关断点 API 文档。综上SetMemoryRangeBPX通过精确的范围控制弥补了SetMemoryBPX的整区域监控粒度问题配合单发、类型过滤能力为逆向分析中只观察某一段内存的特定访问提供了精准而可靠的解决方案其行为亦被仓库内覆盖广泛的回归测试所保障。赞分享逆向工程调试器开发工具应用安全【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址https://gitcode.com/gh_mirrors/x6/x64dbg点击查看免费下载相关推荐Audacity开源音频编辑器从降噪到导出一步到位Audacity开源音频编辑器从降噪到导出一步到位 录完一期播客背景里全是空调的嗡嗡声剪完之后还想存到别的设备继续改。Audacity 就是一干到底的开音频处理桌面应用音视频Checkmate 基础设施监控磁盘选择指南精确控制磁盘与挂载点的监控范围Checkmate 基础设施监控磁盘选择指南精确控制磁盘与挂载点的监控范围 Checkmate 是开源、自托管的实时监控工具其基础设施监控模块负责采集并展示可观测性运维后端前端Lighthouse常见问题FAQ新手最常被问的20个问题解答Lighthouse常见问题FAQ新手最常被问的20个问题解答 Lighthouse 是由 Harbour Masters 团队开发的经典 N64 游戏《Ba游戏开发逆向工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →