资讯动态

x64dbg从入门到实战:插件配置、断点调试与绕过反调试的逆向手记

发布时间:2026/10/2 12:45:23 来源:尧图企业网站定制
简介X64dbg反汇编逆向神器是一款面向逆向工程与程序调试的专业工具支持中文界面与多种插件适合安全分析人员、安卓开发者和逆向爱好者使用。它可对APK完成反编译、打包、拆分、合并、签名等操作也具备侧边栏、动态识别模块指令、反汇编与自动化调试等多种功能可在调试中快速定位关键代码。压缩包内共242个文件大小27.42MB包含78个dll动态库、16个lib导入库与12个a静态库等核心组件5个exe程序入口以及45个png图标、40个qm语言文件、33个h头文件、5个txt说明和chm帮助文档等文件类型覆盖运行库、界面资源、语言汉化与说明文档整体结构清晰可按需查看与配置。目前已有269人学习下载组件齐全适合本地搭建调试环境、研究插件扩展机制与反汇编流程入门到进阶的逆向学习者均可按需取用。1. X64dbg反汇编逆向老手为什么离开 OllyDbg拿到一个陌生 Windows 可执行文件IDA 的 F5 能给你伪代码但伪代码不结合内存变化看你很难确认它到底读的是哪块缓冲区。X64dbg 的价值就在这个断点上它是 Windows 平台下最顺手的 64 位 / 32 位动态反汇编调试器v2023.05.07 是 2023 年 5 月 7 日构建的快照版。它能加载目标后逐条执行汇编、改寄存器、下条件断点、dump 内存把加密算法和校验逻辑一步步摸出来。适合做 exe 算法还原、样本行为分析、脱壳修复的人用尤其是从 OllyDbg 时代过来的老手能在它身上找到更现代的界面和更完整的脚本能力。一句话静态分析没头绪时该轮到它上场了。2. 下载与初始化v2023.05.07 的目录规划与插件放置2.1 下载渠道与版本选择release 快照和每日构建怎么选x64dbg 没有语义化版本号它的版本就是构建日期。v2023.05.07 表示 2023 年 5 月 7 日构建的发布快照从 GitHub Releases 页面下载x64dbg.zip即可。不要迷信每日构建每日构建功能可能更前沿但插件兼容性和稳定性都不如发布快照。我常用的策略是留一份发布快照做日常调试再留一份当日构建做新插件尝试两个目录互不干扰。下载完成后先做哈希校验。SHA256 可以在 Releases 页面拿到用 PowerShell 或者 7-Zip 校验Get-FileHash .\x64dbg.zip -Algorithm SHA256这个命令输出的是 zip 包的哈希值比对官方页面值一致再解压。哈希校验这一步没必要每次都做但如果你是从镜像站下载的还是花十秒钟看一眼踏实。解压时建议保持目录结构完整不要只把 exe 拖出来因为插件、符号、脚本都依赖相对路径。2.2 目录结构与插件放置经常被搞错的 release 子目录解压后的根目录有x64dbg.exe、x32dbg.exe、x96dbg.exe和一个release子目录。x96dbg.exe是启动器双击它会自动按目标位宽选择 x64dbg 还是 x32dbg日常使用直接开这个。release目录才是真正放程序文件的地方里面有 x64、x32 两个子目录对应 64 位和 32 位调试器的可执行文件与插件目录。很多人误把插件当成根目录下一扔就能用结果在插件菜单里怎么都看不到。x64dbg 只认release\x64\plugins和release\x32\plugins这两个目录。常见的几个插件我列在下面插件用途放置路径ScyllaHide隐藏调试器痕迹绕过反调试release\x64\pluginsxAnalyzer分析 API 调用约定自动标注参数release\x64\pluginsOllyDumpEx内存转储配合 Scylla 重建导入表release\x64\pluginsScylla从转储文件重建 IATrelease\x64\plugins插件文件后缀是.dp64的放 64 位目录.dp32的放 32 位目录。放进去之后重启调试器在插件菜单里就能看到。如果你要用 32 位调试器分析老程序记得同样把.dp32版本复制到release\x32\plugins。这个目录细节很关键很多人卡在这一步发现插件菜单全灰其实就是放错了地方。2.3 杀毒软件误报与白名单解压三分钟就被隔离x64dbg 的本质是调试器它要读写目标进程内存、创建调试线程这些行为跟木马的后门操作没有本质区别所以杀软报毒是常态而不是异常。解压完大约三分钟内Windows Defender 就会开始动手隔离。经验做法是解压前先给整目录加白名单或者直接把目录丢进影子系统、断网虚拟机里跑。白名单设置路径因杀软不同但核心就一句话把 x64dbg 的解压根目录加入排除项同时把release\x64目录也加进去因为主程序实际从那里启动。如果调试目标本身是恶意样本建议在 Windows 10 沙箱或 VMware 里调试别在主力机上硬扛。常见做法是配一个快照虚拟机里面只放调试器和样本出问题直接回滚比手动清理干净得多。3. 核心调试面板从加载目标到定位关键校验代码的完整路径3.1 加载目标与入口断点从系统断点到真正的程序入口双击 x96dbg.exe 打开File - Open 选择目标 exe。程序会先停在系统断点System Breakpoint这个断点在 ntdll 的初始化代码里这时候目标模块还没加载完。按 F9 让流程跑到入口断点Entry Breakpoint入口断点是 PE 头里的 AddressOfEntryPoint也就是程序真正的第一条代码。如果目标带 TLS 回调x64dbg 会在入口断点之前先停到 TLS 注册的地方TLS 回调常用于反调试第 4 章会展开。到入口断点后按 F7 或 F8 单步就可以开始看程序怎么初始化了。F7 是步入进 call 内部F8 是步过不进入子函数。反汇编窗口默认显示当前 EIP/RIP 附近的指令流右侧的寄存器窗口和栈窗口同步刷新。想快速改地址按 CtrlG 输入十六进制地址或符号名。怎么快速找到 main三个常见做法如果符号表加载成功调用堆栈窗口可以看到mainCRTStartup反汇编窗口 CtrlG 输入main跳过去。没有 PDB 时先下断GetCommandLineW运行后看栈回溯哪一层调用了它通常就是 main。字符串定位右键 - 搜索 - 当前模块 - 字符串引用找到请输入注册码这类提示双击跳到引用处往上翻几条指令就是校验逻辑。这个字符串定位法在 x64dbg 使用教程里反复出现因为它确实是最快的手工定位方式。搜不到时注意编码Unicode 程序用 UTF-16ASCII 程序才是单字节搜索对话框里要选对编码类型否则会漏。3.2 条件断点、内存断点和硬件断点三种断点怎么选调试注册算法最常见的是软件断点。F2 在一个地址上下断点本质是把指令第一个字节改写成 0xCCint3执行到那里就停下。软件断点的问题在于改了指令容易被自校验发现而且多了之后速度会明显下降。条件断点在断点窗口里右键目标断点 - 编辑条件。x64 下按寄存器条件写rcx 0x1000 rdx 0x40这个条件的含义是当 rcx 等于 0x1000 且 rdx 等于 0x40 时才停顿。实际调试注册码时我倾向于直接把条件断点记录日志而不是真的停下来这个用法在第 5 章讲。硬件断点有四条可用不修改指令通过 DR 寄存器实现读、写、执行都可以断而且比软件断点稳。代码段下断优先用硬件执行断点数据段就用内存断点。内存断点选中数据窗口的一段区域右键 - 断点 - 内存访问当目标程序访问这段内存时就会停下。举例注册码比对函数读了一个内存缓冲你在缓冲上放内存访问断点谁在读它一览无余。它的缺点是会显著拖慢运行速度因为每次内存访问都要检查是否符合条件所以使用范围尽量缩小不要整块缓冲都选。3.3 修改执行流与导出补丁把 jz 改成 jnz 之后的事定位到校验跳转后选中那条jz指令按空格或在右键菜单里选汇编改成jnz或nop。这个操作只是改了内存里的值并没有写回文件。确认 patch 有效之后右键 - 补丁 - 将所有修改导出到文件生成一个新 exe。注意动态调试的 patch 有效不代表静态 patch 有效。如果程序对自身做 CRC 校验改数据后运行时自检就会报警。遇到这种情况正确的姿势是下钻到自检函数把校验返回值改成 0或者绕开校验逻辑后再导出。这个点展开就是第 4.5 条。导出补丁前建议在命令框里输入savedata相关命令前先记录好修改地址方便出问题时回退。我一般在寄存器窗口旁边开一个便签窗口把每次 patch 的地址和原始字节记下来手动改错还有后悔药吃。4. 避坑指南x64dbg 调试里常见的五个翻车点4.1 断点设了但程序不停反调试与 TLS 回调在作怪现象按 F2 下断F9 运行结果程序直接跑完弹个错误框断点一次都没触发。原因目标程序检测到调试器存在。最常见的检测点是 IsDebuggerPresent、NtQueryInformationProcess以及 PEB 的 BeingDebugged 标志。如果它做了 TLS 回调入口断点之前就已经把检测跑完了。解决加载 ScyllaHide 插件把隐藏 PEB、NtQueryInformationProcess 的选项开起来。手工做法是在系统断点停住后在命令框里输入eb peb2 0这条命令把 PEB 的 BeingDebugged 标志清零把调试器的存在痕迹擦掉。做过这一步再 F9很多裸奔的反调试都能绕过去。ScyllaHide 里还要勾选KillAntiAntiDebug相关选项尤其是对 NtQueryInformationProcess 的处理这个 API 返回的 ProcessBasicInformation 结构会被仔细检查。4.2 x64 下读参数读得一头雾水调用约定已经变了现象在 call 指令前想看看参数是什么按 32 位的经验看栈顶[esp4]看到的数字跟函数行为完全对不上。原因x64 下前四个整数参数用 rcx、rdx、r8、r9 传四个之后才用栈栈上还要留 32 字节的影子空间。esp 在 x64 下叫 rsp看栈顶容易但值已经不是参数了。解决把反汇编窗口右键菜单里的调用约定显示切换到fastcall64或者直接用寄存器窗口观察 rcx 到 r9。要是碰上 fastcall 混用最稳妥是看函数原型选中 call 指令xAnalyzer 插件会自动标注参数位置。x64dbg 的伪寄存器里可以直接用arg1、arg2来引用这些位置写条件断点时会方便很多。4.3 符号全变成 sub_7FF7API 名字一个都看不见现象反汇编窗口里函数名全是sub_7FF7B45C1200这种MessageBoxW、ReadFile 这些 API 全不显示。原因符号文件没加载。可能是没有配置微软符号服务器也可能是调试器选项里解析导出符号没开。解决Options - Preferences - Symbols勾选解析导出符号并把微软符号服务器地址填好。配好之后在符号标签页里手动触发下载系统 DLL 的 PDBAPI 识别会恢复正常。符号服务器地址用微软官方那个就行注意网络环境要能直达。下载好的 PDB 会缓存在本地路径建议手动指定一个固定目录比如D:\symcache避免每次重下。4.4 断点一多程序慢得像幻灯片现象下了十几个软件断点F9 运行后程序肉眼可见地卡顿。原因软件断点每个都是 0xCC 注入执行到断点时调试器要切换上下文、抛出异常、再恢复单次开销不小数量一多就拖垮速度。解决优先用硬件执行断点替换热点位置的软件断点。数据类观察用内存断点。实在躲不开就在关键位置用条件记录断点不打断程序只把值写到日志里效率远高于反复停。硬件断点最多只有四个省着用只断关键跳转和 API 入口其他位置用记录断点代替。4.5 补丁导出后程序直接退出自校验和 CRC 校验现象内存里把jz改成jnz后功能正常导出成新 exe 一跑就闪退。原因程序对自身镜像或文件做了 CRC 校验改动被检测到。解决不要急着导出先在动态调试里找到校验函数。常见校验点在 ExitProcess 之前的尾部检查或者定时器回调里。下断后观察它的校验算法把返回结果改成 0 让校验通过再导出补丁。还有一个更省事的思路如果校验只在启动时跑一次你可以在内存里改完跳转后再把校验函数整个 NOP 掉最后导出。校验范围如果包含你 patch 的区域就先绕过校验逻辑再 patch 跳转顺序反了必崩。5. 脚本自动化条件记录断点和启动脚本的进阶用法5.1 条件记录断点不打断程序也能拿到参数在目标地址右键 - 断点 - 条件记录断点可以设置只在某条件下记录以及记录内容。这个功能不打断程序运行而是把表达式值写到日志窗口用起来很顺手。比如分析一个一直在被调用的解密函数0x140001234 是入口rcx 指向密文缓冲区。设一个条件记录断点记录格式rip{rip:x} arg1{arg1:x} arg2{arg2:x}{rip:x}打印当前指令地址{arg1:x}和{arg2:x}以十六进制打印函数第一、第二个参数。运行一小段后日志窗口会输出每一次调用时密文地址和长度。如果你要还原注册算法这比 F8 单步到天亮高效得多。条件部分还可以写arg2 0x100只记录长度大于 0x100 的调用噪声直接过滤掉。这个技巧在 JS 逆向、App 逆向场景里观察加密请求的组装过程非常顺手。5.2 启动脚本把初始化动作压缩到十秒每次调试都手动点一遍菜单下断点太累。x64dbg 支持在启动时执行脚本命令行参数是x64dbg.exe /c D:\scripts\myinit.txt脚本文件里可以批量下断点、开日志、配置插件// myinit.txt初始化调试环境 // 关闭异常断点提示避免无意义中断 SetExceptionBPX 0 // 在常用 API 上下断 bp CreateFileW bp ReadFile bp WriteFile bp GetProcAddress // 输出日志确认脚本执行成功 log init doneSetExceptionBPX 0是把所有异常断点关掉程序再抛访问违规也不会把你从流程里拽出来。bp命令批量下断点比手动按 F2 快一个量级。日常做样本分析时这个脚本配合 ScyllaHide 的自动隐藏能把每次分析的前期准备压缩到十秒以内。把脚本再往上推一层还能把反汇编结果与 IDA、Ghidra 配合着用。x64dbg 负责动态执行把关键地址和寄存器变化记下来静态分析器负责还原伪代码两边对照着看是效率最高的组合。跟 frida 比的话frida 适合批量 hook 和跑大规模输入验证但单点精读寄存器、看硬件断点还是 x64dbg 直给。按我的个人习惯frida 写快速验证脚本x64dbg 做精细的单步分析两边各管一段。很久以前我拿一个加了反调试又带时间校验的样本练手上来就 F8 硬单步两个小时全花在跟断点较劲上。后来才反应过来动态调试第一步不是单步而是先把环境准备好隐藏调试器、符号服务器、记录断点铺好再用脚本把重复劳动交给命令。从那以后我每次拿到新样本都强制走一遍这套初始化流程再没在 PEB 反调试上吃过同样的亏。希望这份手记里选版本、放插件、绕自校验的经验能帮到你装好它按第 2 章的目录放插件按第 4 章的坑绕一绕你会比我当年少走很多弯路。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑