十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

x64dbg 调试桥接 API 完全指南:深入解析 Dbg* 调试函数集

x64dbg 调试桥接 API 完全指南:深入解析 Dbg* 调试函数集 x64dbg 调试桥接 API 完全指南深入解析 Dbg* 调试函数集【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbgx64dbg 是一个面向 Windows 用户态的开源调试器专为逆向工程与恶意软件分析场景优化。本文以官方开发者文档 docs/developers/functions/debug/index.rst 中的 Debug Functions 章节为骨架系统梳理 x64dbg 对外暴露的 95 个Dbg*调试函数它们是什么、如何被桥接层转发到调试引擎、每个函数族的典型用法与底层实现原理。读完本文你将掌握通过 Dbg API 执行调试命令、读写目标进程内存、求值表达式、操作断点与标签注释、控制脚本执行等插件开发核心能力。一、Dbg API 是什么GUI 与调试引擎之间的桥梁x64dbg 采用双进程架构图形界面GUI 进程与调试引擎dbg 模块分离。为了让插件、脚本以及 GUI 本身能够安全、统一地调用调试引擎能力工程在 src/bridge 目录实现了一层桥接层。这 95 个Dbg*函数正是桥接层对外暴露的调试接口它们集中声明于 src/bridge/bridgemain.h实现于 src/bridge/bridgemain.cpp。每个DbgXxx函数内部通常只是简单转发到调试引擎侧导出的_dbg_xxx函数// src/bridge/bridgemain.cpp BRIDGE_IMPEXP bool DbgIsDebugging() { return _dbg_isdebugging(); } BRIDGE_IMPEXP bool DbgCmdExec(const char* cmd) { return _dbg_dbgcmdexec(cmd); }调试引擎侧以 DLL 导出函数的形式提供实现见 src/dbg/_exports.h从而将调用方线程与调试器内部状态隔离。此外还有一条更现代化的通道DbgFunctions()返回一个DBGFUNCTIONS函数表指针结构体声明于 src/bridge/bridgemain.h该表在 src/dbg/_dbgfunctions.cpp 的dbgfunctionsinit()中被逐项填充例如// src/dbg/_dbgfunctions.cpp void dbgfunctionsinit() { _dbgfunctions.ModBaseFromName ModBaseFromName; _dbgfunctions.ValFromString [](const char* string, duint * value) { return valfromstring(string, value); }; ... }两类通道的关系可概括为Dbg*函数面向插件与 GUI 的稳定 C 接口覆盖命令执行、内存、断点、标签等高频操作DBGFUNCTIONS函数表承载更多底层或低频能力模块枚举、JIT 查询、调用栈、句柄枚举、Trace 记录等。二、生命周期与初始化函数函数原型见 src/bridge/bridgemain.h作用DbgInitconst char* DbgInit()初始化调试器返回错误消息成功时为 NULL/空DbgInitBlockingconst char* DbgInitBlocking()阻塞式初始化内部调用_dbg_dbginit(true)DbgExitvoid DbgExit()向调试引擎发送退出信号_dbg_dbgexitsignal()DbgFunctionsconst DBGFUNCTIONS* DbgFunctions()获取扩展函数表指针DbgSettingsUpdatedbool DbgSettingsUpdated()通知调试引擎设置已变更触发相关缓存刷新DbgMenuEntryClickedvoid DbgMenuEntryClicked(int hEntry)通知调试引擎某个菜单项被点击DbgWinEvent/DbgWinEventGlobalbool DbgWinEvent(MSG* message, long* result)将 GUI 窗口消息转发给调试引擎处理其中DbgInit/DbgInitBlocking通常在插件pluginit阶段之前由主程序调用用于装载符号、准备调试循环DbgExit用于有序关闭避免调试会话中途被粗暴终止。三、命令执行异步与同步两条路径命令执行是插件与调试器交互最高频的入口。文档DbgCmdExec.md、DbgCmdExecDirect.md区分了两种语义截然不同的执行方式。3.1 DbgCmdExec —— 异步投递bool DbgCmdExec(const char* cmd);参数cmd为 UTF-8 编码的命令字符串返回值命令是否成功投递到命令处理线程而非是否执行成功语义调用立即返回命令在命令处理线程上排队异步执行。从源码看src/dbg/x64dbg.cpp 中_dbg_dbgcmdexec先将命令字符串复制到堆上再通过消息队列投递extern C DLL_EXPORT bool _dbg_dbgcmdexec(const char* cmd) { int len (int)strlen(cmd); char* newcmd (char*)emalloc((len 1) * sizeof(char), _dbg_dbgcmdexec:newcmd); strcpy_s(newcmd, len 1, cmd); return MsgSend(gMsgQueue, 0, (duint)newcmd, 0); }投递后由DbgCommandLoopThread驱动的cmdloop()消费队列。文档给出的示例DbgCmdExec(run)即通过该路径让目标程序继续运行调用方无需阻塞等待运行结束。适用场景触发run、pause、StepInto等会阻塞/改变调试状态的命令时应使用异步版本避免在插件回调如断点回调中死锁。3.2 DbgCmdExecDirect —— 同步执行bool DbgCmdExecDirect(const char* cmd)参数cmd为 UTF-8 编码的命令字符串返回值命令是否执行成功语义在当前调用线程上同步执行函数返回时命令已完成。底层实现在 src/dbg/command.cpp 的cmddirectexec()先按分隔符拆分命令列表逐条查找命令回调若命令不存在则回退到表达式解析器把输入当作表达式求值结果写入$ans变量若命令标记为debugonly且当前未处于调试状态则拒绝执行并返回false。COMMAND* found cmdget(command.c_str()); if(!found || !found-cbCommand) //unknown command { ExpressionParser parser(command); duint result; if(!parser.Calculate(result, valuesignedcalc(), true, false)) return false; varset($ans, result, true); continue; } if(found-debugonly !DbgIsDebugging()) { dprintf(QT_TRANSLATE_NOOP(DBG, The command \%s\ is debug-only\n), command.c_str()); return false; }因此DbgCmdExecDirect(12)这类非命令表达式同样可用。文档示例DbgCmdExecDirect(run);适用场景在插件自己的工作线程中执行短小、不会长时间阻塞的查询/修改命令并需要立即读取副作用时使用。3.3 选择建议维度DbgCmdExecDbgCmdExecDirect执行线程命令处理线程调用方线程返回时机投递即返回执行完毕后返回是否阻塞否是典型场景run / step / trace求值、查询、轻量修改四、内存访问函数族调试目标进程的内存读写是逆向插件的核心需求相关函数声明见 src/bridge/bridgemain.h。4.1 DbgMemRead / DbgMemWritebool DbgMemRead(duint va, void* dest, duint size); bool DbgMemWrite(duint va, const void* src, duint size);va目标虚拟地址dest/src调用方预分配的缓冲区指针size读写字节数。桥接层实现src/bridge/bridgemain.cpp有两个值得注意的细节Debug 构建下做边界检查DbgMemRead用IsBadWritePtr(dest, size)、DbgMemWrite用IsBadReadPtr(src, size)校验调用方缓冲区非法时打印日志并触发__debugbreak()读失败自动清零目标缓冲区_dbg_memread失败时对dest执行memset(dest, 0, size)再返回false因此调用方必须检查返回值不能依赖缓冲区内容。文档DbgMemRead.md给出了一个读取反汇编窗口用户选中数据区的完整示例// read user selected data from disassembly window SELECTIONDATA sel; GuiSelectionGet(GUI_DISASSEMBLY, sel); uint16_t size sel.end - sel.start 1; uint8_t* dest new uint8_t[size]; bool success DbgMemRead(sel.start, dest, size); // on success, the selected data is stored in dest4.2 DbgMemFindBaseAddr / DbgMemGetPageSizeduint DbgMemFindBaseAddr(duint addr, duint* size); duint DbgMemGetPageSize(duint base);DbgMemFindBaseAddr文档见 DbgMemFindBaseAddr.md接收任意位于某模块内的地址返回该模块基址并通过size出参返回模块大小失败返回 0。桥接层实现直接转发_dbg_memfindbaseaddrBRIDGE_IMPEXP duint DbgMemFindBaseAddr(duint addr, duint* size) { return _dbg_memfindbaseaddr(addr, size); }DbgMemGetPageSize内部复用_dbg_memfindbaseaddr取模块大小源码中标注了 FIXME 注释指出其语义近似于base两者常配合使用先用DbgMemFindBaseAddr定位模块再结合模块大小规划扫描范围。4.3 其他内存接口函数作用DbgMemIsValidReadPtr(duint addr)判断地址是否可读转发_dbg_memisvalidreadptrDbgMemMap(MEMMAP* memmap)获取完整内存映射内存窗口数据来源DbgMemGetPageSize(duint base)获取地址所在内存页/模块大小五、表达式求值与数值转换5.1 DbgValFromString —— 表达式求值duint DbgValFromString(const char* string);文档DbgValFromString.md指出string是需要求值的表达式UTF-8 编码返回表达式计算结果。表达式系统支持 C 风格运算符、寄存器名如cip、内存解引用、变量与表达式函数详见 docs/introduction/Expressions.md 与 docs/introduction/Expression-functions.md。文档示例——读取当前指令指针eip DbgValFromString(cip);桥接实现src/bridge/bridgemain.cpp先调用_dbg_valfromstring成功与否都返回计算结果失败时为 0BRIDGE_IMPEXP duint DbgValFromString(const char* string) { duint value 0; _dbg_valfromstring(string, value); return value; }5.2 DbgValSetScalar —— 写标量值bool DbgValSetScalar(const char* string, duint value);文档DbgValSetScalar.md特别说明此函数旧名为DbgValToString新名称为DbgValSetScalar。string为要修改的对象名寄存器、变量、标志等UTF-8value为标量值。桥接层为二进制兼容保留了旧导出src/bridge/bridgemain.cppextern C __declspec(dllexport) bool DbgValToString(const char* string, duint value) { return DbgValSetScalar(string, value); }文档示例DbgValSetScalar(eax, 1);5.3 DbgValSetBuffer 与 DbgIsValidExpressionDbgValSetBuffer(const char* string, const void* data, size_t size)按地址写任意字节缓冲如向某内存位置写入一簇字节DbgIsValidExpression(const char* expression)判断字符串是否为合法表达式桥接实现即尝试用_dbg_valfromstring求值src/bridge/bridgemain.cpp求值成功即视为合法BRIDGE_IMPEXP bool DbgIsValidExpression(const char* expression) { duint value 0; return _dbg_valfromstring(expression, value); }5.4 DbgGetStringAtDbgGetStringAt(duint addr, char* text)读取指定地址的字符串内容常用于在悬停提示、日志中展示指针指向的 ASCII/Unicode 字符串。六、状态查询函数族插件在调用与调试状态相关的功能前通常先做状态守卫。6.1 DbgIsDebuggingbool DbgIsDebugging();文档DbgIsDebugging.md描述为判断调试器当前是否正在调试已打开的文件或已附加的进程无参数调试中返回true。底层实现在 src/dbg/debugger.cppbool dbgisdebugging() { return bIsDebugging fdProcessInfo ! nullptr fdProcessInfo-hProcess ! nullptr; }即同时要求调试标志位与有效的进程句柄成立。文档同时给出了 C 与汇编MASM32两种示例if(!DbgIsDebugging()) { GuiAddLogMessage(You need to be debugging to use this option!\n); return false; }.data szMsg db You need to be debugging to use this option!,13,10,0 ; CRLF .code Invoke DbgIsDebugging .IF eax FALSE Invoke GuiAddLogMessage, Addr szMsg .ENDIF6.2 DbgIsRunning 与 DbgIsRunLockedDbgIsRunning()目标进程是否正在运行源码dbgisrunning()为!waitislocked(WAITID_RUN)即运行锁未锁定时即处于运行态DbgIsRunLocked()调试器是否持有运行锁GUI 暂停时通常加锁。两者常配合判断当前是否安全地处于暂停态以读写内存/寄存器。6.3 其他状态接口函数作用DbgIsJumpGoingToExecute(duint addr)判断地址处的跳转指令是否会实际跳转结合标志位模拟DbgGetTimeWastedCounter()获取累计浪费在调试中的时间计数性能观测用DbgIsBpDisabled(duint addr)判断地址处的断点是否处于禁用态七、断点相关函数7.1 DbgGetBpList —— 枚举断点int DbgGetBpList(BPXTYPE type, BPMAP* list);按类型枚举断点type取BPXTYPE枚举值list为BPMAP含count与BRIDGEBP* bp数组。底层实现src/dbg/_exports.cpp将断点类型映射为内部类型后过滤switch(type) { case bp_none: currentBpType -1; break; // 全部类型 case bp_normal: currentBpType BPNORMAL; break; case bp_hardware: currentBpType BPHARDWARE; break; case bp_memory: currentBpType BPMEMORY; break; case bp_dll: currentBpType BPDLL; break; case bp_exception: currentBpType BPEXCEPTION; break; default: return 0; }可见BPXTYPE支持bp_none不过滤返回全部、bp_normal、bp_hardware、bp_memory、bp_dll、bp_exception。返回值是实际枚举到的断点数量0 表示没有匹配断点内部通过BridgeAlloc分配BRIDGEBP数组调用方用完后应通过BridgeFree释放。7.2 DbgGetBpxTypeAtBPXTYPE DbgGetBpxTypeAt(duint addr);查询某地址上命中的断点类型可能同时是普通断点与内存断点的叠加内部转发_dbg_bpgettypeat。配合DbgGetBpList可完整感知断点状态。7.3 断点操作入口index.rst 中的断点类 Dbg 函数主要覆盖查询侧增删改能力则由命令通道如bp、bph、bpm、SetBPX等见 docs/commands/breakpoint-control配合DbgCmdExec/DbgCmdExecDirect完成例如DbgCmdExec(bp 401000)。八、标签、注释、书签与自动标注这批函数围绕用户数据库database中的地址级元数据展开声明于 src/bridge/bridgemain.h类别获取设置清除标签DbgGetLabelAt(addr, seg, text)DbgSetLabelAt(addr, text)DbgClearLabelRange(start, end)注释DbgGetCommentAt(addr, text)DbgSetCommentAt(addr, text)DbgClearCommentRange(start, end)书签DbgGetBookmarkAt(addr)DbgSetBookmarkAt(addr, isbookmark)DbgClearBookmarkRange(start, end)自动标签DbgSetAutoLabelAt(addr, text)—DbgClearAutoLabelRange(start, end)自动注释DbgSetAutoCommentAt(addr, text)—DbgClearAutoCommentRange(start, end)自动书签DbgSetAutoBookmarkAt(addr)—DbgClearAutoBookmarkRange(start, end)自动函数DbgSetAutoFunctionAt(start, end)—DbgClearAutoFunctionRange(start, end)自动系列与用户系列的区别自动标注由分析引擎如自动分析、符号加载写入优先级别低可被用户标注覆盖且可整体按范围批量清除。DbgGetLabelAt的桥接实现值得一提src/bridge/bridgemain.cpp当目标地址没有标签时它会尝试读取该地址处的指针值并解析指针指向的标签以labelname形式返回实现指针悬停即显示被指向符号的效果。相关辅助接口还有DbgGetModuleAt(addr, text)获取地址所属模块名DbgStackCommentGet(addr, STACK_COMMENT* comment)获取栈地址处的自动注释栈回溯提示用DbgGetXrefCountAt(addr)/DbgGetXrefTypeAt(addr)查询地址的交叉引用数量与类型xref 类型见XREFTYPE枚举。九、函数、参数与循环数据库x64dbg 的用户数据库还维护函数Function函数参数Argument循环Loop三种区间型数据结构均提供成对的增删查与重叠检测接口// 函数 bool DbgFunctionGet(duint addr, duint* start, duint* end); // 返回 addr 所在函数区间 bool DbgFunctionOverlaps(duint start, duint end); // 区间是否与已有函数重叠 bool DbgFunctionAdd(duint start, duint end); bool DbgFunctionDel(duint addr); // 函数参数 bool DbgArgumentGet(duint addr, duint* start, duint* end); bool DbgArgumentOverlaps(duint start, duint end); bool DbgArgumentAdd(duint start, duint end); bool DbgArgumentDel(duint addr); // 循环depth 表示循环嵌套深度 bool DbgLoopGet(int depth, duint addr, duint* start, duint* end); bool DbgLoopOverlaps(int depth, duint start, duint end); bool DbgLoopAdd(duint start, duint end); bool DbgLoopDel(int depth, duint addr);配套的类型查询DbgGetFunctionTypeAt(addr)返回FUNCTYPEFUNC_NONE/FUNC_SINGLE单指令/FUNC_BEGIN/FUNC_END/FUNC_MIDDLE桥接实现见 src/bridge/bridgemain.cppDbgGetLoopTypeAt(addr, depth)返回LOOPTYPE语义与函数类型对称DbgGetArgTypeAt(addr)返回ARGTYPE表示地址是否位于某函数参数区及相对位置。十、交叉引用Xrefbool DbgXrefAdd(duint addr, duint from); // 记录 from - addr 的引用 bool DbgXrefDelAll(duint addr); // 删除 addr 的全部引用 bool DbgXrefGet(duint addr, XREF_INFO* info); // 获取 addr 的引用信息 size_t DbgGetXrefCountAt(duint addr); // 引用数量 XREFTYPE DbgGetXrefTypeAt(duint addr); // 引用类型这是引用窗口xrefs的数据后端分析/用户手动标记可把调用来源写入 xref 数据库之后插件可枚举谁引用了某地址用于快速定位调用关系如定位某 API 的所有调用点。仓库中还提供了DbgXrefAddMultisrc/bridge/bridgemain.h用于批量添加多条引用边。十一、汇编与反汇编函数bool DbgAssembleAt(duint addr, const char* instruction); // 在 addr 处汇编单条指令 void DbgDisasmAt(duint addr, DISASM_INSTR* instr); // 反汇编 addr 处指令完整信息 void DbgDisasmFastAt(duint addr, BASIC_INSTRUCTION_INFO* basicinfo); // 快速反汇编基本信息 duint DbgGetBranchDestination(duint addr); // 获取跳转指令的目标地址DbgAssembleAt底层走_dbgfunctions.AssembleAtExsrc/dbg/_dbgfunctions.cpp的assembleat()支持通过选项在补丁时用 NOP 填充空隙DbgDisasmAt返回完整指令信息助记符、操作数、长度、是否跳转等供自定义反汇编视图使用DbgDisasmFastAt只取BASIC_INSTRUCTION_INFO地址、大小、类型等性能更高适合大批量扫描如自动分析、模式匹配DbgGetBranchDestination解析条件/无条件跳转的目标用于构建控制流图。十二、脚本控制函数族脚本 API 覆盖 x64dbg 脚本.txt 脚本的加载、执行、调试与断点控制声明于 src/bridge/bridgemain.h函数作用DbgScriptLoad(const char* filename)加载脚本文件DbgScriptUnload()卸载当前脚本DbgScriptRun(int destline)运行脚本可指定目标行号-1 为运行到结尾DbgScriptStep()单步执行一行脚本DbgScriptBpToggle(int line)/DbgScriptBpGet(int line)切换/查询脚本断点DbgScriptCmdExec(const char* command)在脚本上下文中执行一条命令DbgScriptAbort()中止脚本执行DbgScriptGetLineType(int line)查询行类型SCRIPTLINETYPEDbgScriptSetIp(int line)设置脚本指令指针跳转到指定行DbgScriptGetBranchInfo(int line, SCRIPTBRANCH* info)查询脚本分支信息配合 Jxx 跳转类指令桥接实现大多通过_dbg_sendmessage(DBG_SCRIPT_XXX, ...)把请求投递到调试引擎的消息循环见 src/bridge/bridgemain.cpp保证脚本状态在正确的线程上被修改。十三、符号与模块查询DbgModBaseFromName(const char* name)按模块名如kernel32返回模块基址内部转发ModBaseFromNamesrc/dbg/_dbgfunctions.cpp找不到返回 0。这是按模块名找地址最常用的入口DbgSymbolEnum(duint base, CBSYMBOLENUM cbSymbolEnum, void* user)枚举模块的已加载符号逐个回调DbgSymbolEnumFromCache(duint base, ...)从缓存枚举符号不触发磁盘/网络加载性能更好适合只读场景DbgSymbolEnumRange(duint start, duint end, unsigned int symbolMask, ...)按地址区间与符号掩码过滤枚举src/bridge/bridgemain.h。十四、寄存器、线程与监视DbgGetRegDump(REGDUMP* regdump)获取寄存器快照。该旧接口已废弃仅为二进制兼容保留src/bridge/bridgemain.cpp内部把REGDUMP当作旧尺寸结构转发给DbgGetRegDumpEx。新代码应直接使用bool DbgGetRegDumpEx(REGDUMP_AVX512* regdump, size_t size);它覆盖 AVX-512 寄存器、x87 FPU、MMX、MXCSR 标志位等完整上下文MXCSR/x87 控制字各标志位逐位解析逻辑见 src/bridge/bridgemain.cppDbgGetThreadList(THREADLIST* list)获取线程列表线程窗口数据源返回前需注意THREADLIST的释放约定DbgGetWatchList(ListOf(WATCHINFO) list)获取监视窗口Watch的表达式列表。十五、编码类型EncodeType管理x64dbg 通过编码类型ENCODETYPE标记某段数据被识别为代码、数据、字符串、指令序列等支撑在反汇编/数据视图间正确着色与解析ENCODETYPE DbgGetEncodeTypeAt(duint addr, duint size); // 查询 addr 处 size 字节的编码类型 duint DbgGetEncodeSizeAt(duint addr, duint codesize); // 查询从 addr 开始的编码单元长度 bool DbgSetEncodeType(duint addr, duint size, ENCODETYPE type); // 设置编码类型 void DbgDelEncodeTypeRange(duint start, duint end); // 清除区间编码类型 void DbgDelEncodeTypeSegment(duint start); // 从 start 起清除整段 void* DbgGetEncodeTypeBuffer(duint addr, duint* size); // 获取编码类型缓冲批量查询 void DbgReleaseEncodeTypeBuffer(void* buffer); // 释放上述缓冲DbgGetEncodeTypeBuffer/DbgReleaseEncodeTypeBuffer成对使用前者一次性取回一片地址范围的类型位图后者负责归还内存适合需要对大段内存做类型扫描的性能敏感场景。十六、完整函数索引总表为便于检索下面按文档 index.rst 的分类列出全部 95 个函数并标注所属能力域生命周期/管理DbgInit、DbgExit、DbgFunctions、DbgSettingsUpdated、DbgMenuEntryClicked、DbgWinEvent、DbgWinEventGlobal、DbgGetTimeWastedCounter、DbgIsRunLocked状态查询DbgIsDebugging、DbgIsRunning、DbgIsJumpGoingToExecute、DbgIsValidExpression、DbgIsBpDisabled命令执行DbgCmdExec、DbgCmdExecDirect内存DbgMemRead、DbgMemWrite、DbgMemMap、DbgMemFindBaseAddr、DbgMemGetPageSize、DbgMemIsValidReadPtr表达式/值DbgValFromString、DbgValSetScalar、DbgValSetBuffer、DbgGetStringAt断点DbgGetBpList、DbgGetBpxTypeAt标签/注释/书签/模块/栈注释DbgGetLabelAt、DbgSetLabelAt、DbgClearLabelRange、DbgGetCommentAt、DbgSetCommentAt、DbgClearCommentRange、DbgGetBookmarkAt、DbgSetBookmarkAt、DbgClearBookmarkRange、DbgGetModuleAt、DbgStackCommentGet、DbgSetAutoLabelAt、DbgClearAutoLabelRange、DbgSetAutoCommentAt、DbgClearAutoCommentRange、DbgSetAutoBookmarkAt、DbgClearAutoBookmarkRange、DbgSetAutoFunctionAt、DbgClearAutoFunctionRange函数/参数/循环DbgFunctionGet、DbgFunctionOverlaps、DbgFunctionAdd、DbgFunctionDel、DbgArgumentGet、DbgArgumentOverlaps、DbgArgumentAdd、DbgArgumentDel、DbgLoopGet、DbgLoopOverlaps、DbgLoopAdd、DbgLoopDel、DbgGetFunctionTypeAt、DbgGetArgTypeAt、DbgGetLoopTypeAt交叉引用DbgXrefAdd、DbgXrefDelAll、DbgXrefGet、DbgGetXrefCountAt、DbgGetXrefTypeAt汇编/反汇编DbgAssembleAt、DbgDisasmAt、DbgDisasmFastAt、DbgGetBranchDestination脚本DbgScriptLoad、DbgScriptUnload、DbgScriptRun、DbgScriptStep、DbgScriptBpToggle、DbgScriptBpGet、DbgScriptCmdExec、DbgScriptAbort、DbgScriptGetLineType、DbgScriptSetIp、DbgScriptGetBranchInfo符号/模块DbgSymbolEnum、DbgSymbolEnumFromCache、DbgModBaseFromName寄存器/线程/监视DbgGetRegDump已废弃、DbgGetThreadList、DbgGetWatchList编码类型DbgGetEncodeTypeAt、DbgGetEncodeSizeAt、DbgSetEncodeType、DbgDelEncodeTypeRange、DbgDelEncodeTypeSegment、DbgGetEncodeTypeBuffer、DbgReleaseEncodeTypeBuffer十七、插件开发中的实战要点线程模型先行任何可能长时间阻塞调试器的操作run、step、trace一律走DbgCmdExec异步通道在断点回调、异常回调等调试器线程上下文中优先使用消息投递而非同步等待避免死锁。先守卫状态再动手写内存/寄存器前用DbgIsDebugging()DbgIsRunning()判断当前是否处于可安全修改的暂停态文档示例DbgIsDebugging.md展示了标准的失败提示写法。区分用户数据与自动数据通过DbgSetLabelAt等写入用户标注通过DbgSetAutoLabelAt等写入分析结果两者生命周期不同批量清除时互不误伤。字符串一律 UTF-8所有传入的命令、表达式、标签、注释字符串均为 UTF-8 编码文档在DbgCmdExec、DbgValFromString等函数中反复强调使用前请做编码转换。注意缓冲区约定DbgMemRead失败会清零目标缓冲区DbgGetBpList返回的BRIDGEBP*数组由内部BridgeAlloc分配使用后需BridgeFreeDbgGetEncodeTypeBuffer需配对DbgReleaseEncodeTypeBuffer。寄存器读取使用新 API避免使用已废弃的DbgGetRegDump改用DbgGetRegDumpEx并传入结构体大小。充分利用表达式系统DbgValFromString可以直接求值[模块名:偏移]、cip、变量等任意表达式语法见 docs/introduction/Expressions.md比手工解析地址高效得多。十八、进一步阅读各函数独立文档docs/developers/functions/debug如 DbgCmdExec.md、DbgMemRead.md、DbgValSetScalar.md桥接层头文件完整函数签名与结构体src/bridge/bridgemain.h桥接层实现src/bridge/bridgemain.cpp调试引擎导出实现src/dbg/_exports.cpp、src/dbg/_dbgfunctions.cpp命令执行核心src/dbg/command.cpp、src/dbg/x64dbg.cpp插件开发基础与回调/结构文档docs/developers/plugins/basics.md、docs/developers/plugins/API、docs/developers/plugins/Callbacks表达式语法docs/introduction/Expressions.md、docs/introduction/Expression-functions.md【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表