拓冰建站拓冰建站
首页 / 资讯中心 / 正文

x64dbg 插件开发指南:DbgDelEncodeTypeRange 删除编码类型范围

x64dbg 插件开发指南DbgDelEncodeTypeRange 删除编码类型范围【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbgDbgDelEncodeTypeRange是 x64dbg 调试器向插件与 GUI 层开放的核心 Bridge API 之一用于批量清除指定内存地址区间内的编码类型EncodeType标记。本文以 DbgDelEncodeTypeRange.md 为骨架结合 src/bridge/bridgemain.cpp、src/dbg/encodemap.cpp 与 src/gui/Src/Utils/EncodeMap.cpp 等源码完整讲解该 API 的声明、参数语义、返回行为、底层调用链与实战调用场景。读完本文你将掌握如何在插件中用该 API 精确撤销一段内存上已被标记的数据类型字节、字、双字、结构体等并理解它与DbgSetEncodeType、DbgGetEncodeTypeAt等配套 API 的协作方式。一、函数签名与声明位置在 x64dbg 的 Bridge 层GUI 与调试核心之间的通信层该函数的导出声明位于 src/bridge/bridgemain.hBRIDGE_IMPEXP void DbgDelEncodeTypeRange(duint start, duint end);其实现位于 src/bridge/bridgemain.cppBRIDGE_IMPEXP void DbgDelEncodeTypeRange(duint start, duint end) { _dbg_sendmessage(DBG_DELETE_ENCODE_TYPE_RANGE, (void*)start, (void*)end); }从声明可以看出两个要点返回类型为void该 API 不向调用方返回成功/失败标志删除操作是尽力而为的广播式调用参数为两个duint地址duint是 x64dbg 定义的无符号整数类型duint Debug Unsigned INT在 32 位构建下为 32 位、64 位构建下为 64 位因此该 API 天然同时支持 32 位与 64 位目标进程的地址空间。duint的完整定义可查阅 src/dbg/_global.h 及 src/bridge/bridgemain.h 顶部的类型重定义它是 x64dbg 所有 Bridge 地址类参数的标准类型。二、参数语义闭区间 [start, end]start要删除编码类型标记的起始虚拟地址end要删除编码类型标记的结束虚拟地址包含该地址本身。即该 API 操作的地址范围是闭区间[start, end]长度len end - start 1。这一点在调试核心的实现中有直接佐证——src/dbg/encodemap.cppvoid EncodeMapDelRange(duint Start, duint End) { if(End Start) return; EncodeMapSetType(Start, End - Start 1, enc_unknown); }注意两个行为细节参数顺序校验若End Start函数直接返回不执行任何删除操作安全兜底不会产生异常行为本质是覆盖为 unknown删除操作并非物理移除记录而是将区间内每个地址的编码类型统一覆盖为enc_unknown随后由编码映射的底层存储机制进行回收与维护。三、返回行为与调用约定DbgDelEncodeTypeRange返回void因此调用方无法直接判断删除是否成功调用后如需确认结果应使用配套查询 APIDbgGetEncodeTypeAt(duint addr, duint size)见 src/bridge/bridgemain.cpp检查目标地址的编码类型是否已回落为enc_unknown。该函数可以在目标进程暂停状态下安全调用这也是 x64dbg 插件 API 的普遍约定——大多数调试状态修改类 API 需要进程处于暂停/调试会话中。它通过_dbg_sendmessage将请求投递给调试核心线程处理属于异步消息式的 Bridge 调用调用线程不会阻塞等待核心端的同步完成。四、底层调用链与核心实现整条调用链可以概括为插件/GUI 调用 DbgDelEncodeTypeRange(start, end) → _dbg_sendmessage(DBG_DELETE_ENCODE_TYPE_RANGE, start, end) → 调试核心消息分发src/dbg/_exports.cpp 中的主分发函数 → EncodeMapDelRange(start, end) → EncodeMapSetType(start, end - start 1, enc_unknown) → 编码映射encmaps哈希表更新4.1 Bridge 消息分发在调试核心的消息分发器 src/dbg/_exports.cpp 中case DBG_DELETE_ENCODE_TYPE_RANGE: { EncodeMapDelRange((duint)param1, (duint)param2); } break;DBG_DELETE_ENCODE_TYPE_RANGE消息将两个duint地址透传给核心实现EncodeMapDelRange。4.2 编码映射的核心数据结构编码映射EncodeMap是 x64dbg 用于记录每个内存地址被解释为什么数据类型的全局映射表属于调试核心 src/dbg/encodemap.cpp 模块。其底层为一个以模块基址为键的哈希表encmaps每个条目对应一个内存区域区域内的每个字节保存一个ENCODETYPE枚举值enc_unknown未知/未标记默认状态enc_byte、enc_word、enc_dword、enc_qword、enc_fword、enc_tbyte等整型数据类型enc_float、enc_double、enc_longdouble、enc_mmword、enc_xmmword、enc_ymmword浮点与 SIMD 类型enc_ascii、enc_unicode字符串类型enc_code代码enc_junk垃圾数据enc_middle指令中间字节。ENCODETYPE枚举的完整定义见 src/dbg/encodemap.h它是 x64dbg 数据区dump 视图按类型渲染的根本依据。4.3 删除即覆盖为 enc_unknownEncodeMapDelRange的实现非常简洁校验End Start后把区间长度End - Start 1连同enc_unknown一起交给EncodeMapSetType。这意味着删除标记与设置标记走的是同一条底层写入路径区别仅在于写入的目标类型是enc_unknown。从数据结构层面看区间删除的复杂度与区间内地址数量相关因为需要逐地址更新映射条目。五、实战示例如何在插件中调用5.1 基础用法在插件代码中需#include bridgemain.h清除0x401000到0x4010FF共 256 字节的编码类型#include bridgemain.h void ClearTypeMark(duint startAddr, duint size) { if(size 0) return; DbgDelEncodeTypeRange(startAddr, startAddr size - 1); } // 示例调用清除 0x401000 起的 256 字节 ClearTypeMark(0x401000, 0x100);注意与EncodeMap::delRangeGUI 侧封装见 src/gui/Src/Utils/EncodeMap.cpp保持一致的换算方式——它传入的是(start, start size - 1)void EncodeMap::delRange(duint start, duint size) { if(size) DbgDelEncodeTypeRange(start, start size - 1); }即调用方负责把起始地址 长度换算成闭区间端点API 内部不做长度换算。5.2 配合查询 API 验证删除结果删除后可用DbgGetEncodeTypeAt验证返回enc_unknown即删除成功#include bridgemain.h bool VerifyRangeCleared(duint start, duint size) { for(duint i 0; i size; i) { if(DbgGetEncodeTypeAt(start i, 1) ! enc_unknown) return false; } return true; }5.3 典型使用场景撤销误标记当分析过程中对一段内存错误地设置了类型标记例如误标为结构体或字符串可用该 API 一键还原为enc_unknown再重新标记重新分析区域配合analyse/cfanalyse类分析命令先清除旧标记、再重新执行分析避免陈旧类型信息干扰数据区dump刷新GUI 侧EncodeMap::delRange在用户清除数据类型操作时被调用之后数据视图会依据更新后的编码映射重新渲染getDataType/getDataSize读取映射结果见 src/gui/Src/Utils/EncodeMap.cpp。六、与配套 API 的关系DbgDelEncodeTypeRange属于 x64dbg 编码类型EncodeTypeAPI 家族相关函数均定义在 src/bridge/bridgemain.h 中共享相同的 Bridge 消息机制API作用Bridge 消息DbgSetEncodeType(addr, size, type)为区间设置编码类型_dbg_encodetypeset见 src/bridge/bridgemain.cppDbgGetEncodeTypeAt(addr, size)查询某地址的编码类型DBG_ENCODE_TYPE_GETDbgGetEncodeSizeAt(addr, codesize)查询某地址的编码尺寸DBG_ENCODE_SIZE_GETDbgDelEncodeTypeRange(start, end)删除清除闭区间编码类型DBG_DELETE_ENCODE_TYPE_RANGEDbgDelEncodeTypeSegment(start)删除某段模块段的全部编码类型DBG_DELETE_ENCODE_TYPE_SEG见 src/bridge/bridgemain.cppDbgGetEncodeTypeBuffer/DbgReleaseEncodeTypeBuffer获取/释放编码类型缓存缓冲区DBG_GET_ENCODE_TYPE_BUFFER/DBG_RELEASE_ENCODE_TYPE_BUFFER几点使用建议区间粒度 vs 段粒度只清除一小段地址范围用DbgDelEncodeTypeRange要清空整个段如卸载模块时用DbgDelEncodeTypeSegment后者更高效GUI 侧缓存同步GUI 的EncodeMap类维护了按需加载的内存缓存mBuffer当删除区间落在缓存范围内时va mBase va mBase mSize需要调用DbgReleaseEncodeTypeBuffer释放失效缓存参见 src/gui/Src/Utils/EncodeMap.cpp 中delSegment的处理方式。插件若直接调用 Bridge API则需自行保证与自身缓存的一致性调试核心侧消息分发插件开发者如要实现自定义调试核心扩展需在核心消息分发器中处理DBG_DELETE_ENCODE_TYPE_RANGE消息参考 src/dbg/_exports.cpp 的 case 分支。七、总结DbgDelEncodeTypeRange是 x64dbg 编码类型管理体系中用于批量撤销标记的原子操作其核心语义可归纳为参数为闭区间[start, end]end start时安全返回返回void删除结果需用DbgGetEncodeTypeAt验证底层通过DBG_DELETE_ENCODE_TYPE_RANGE消息到达调试核心最终由EncodeMapDelRange将区间覆盖为enc_unknown见 src/dbg/encodemap.cpp与DbgSetEncodeType、DbgGetEncodeTypeAt、DbgDelEncodeTypeSegment等 API 配合可完整覆盖标记 → 查询 → 局部清除 → 整段清除的数据类型管理闭环。对于编写逆向分析辅助插件的开发者而言掌握该 API 即可精确控制数据区视图的类型渲染是构建可重入分析、动态数据类型推断类插件的基础能力之一。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门