简介
官网: https://x64dbg.com/
github地址: https://github.com/x64dbg/x64dbg
更新频繁的现代化windows用户态调试工具,支持调试32位、64位程序,开源,因为更新太频繁,文档更新不太跟得上,但旧文档也足够用了。
文档地址: https://help.x64dbg.com/en/latest/
搭配各种插件用起来很不错,还可以和反编译工具共享符号,更方便调试。
插件集合: https://github.com/x64dbg/x64dbg/wiki/Plugins
OllyDbg是老牌的调试工具,但对64位程序的调试支持不好,而且已经停止维护,缺少很多特性,所以这里详细介绍x64dbg的使用方法和技巧。
使用
界面组成
常用快捷键
F2 最常用的软件断点
F4 运行到当前选中的地址
F7 步入,即单步调试,当指令为调用函数时,进入函数
F8 步过,即单步调试,当指令为调用函数时,不进入函数,“过”意思类似大禹的三过家门而不入
F9 运行,直到程序执行完或遇到断点
Ctrl + G 跳转到指定地址
使用思路
一般都配合反编译工具进行调试,使用反编译工具分析,确定要在哪儿下什么类型的断点,要怎么运行,要观察什么数据,要保存什么数据。
一个例子
某程序运行弹窗如下:
明显输出不完整,使用IDA加载程序,查看逻辑。注意到v11可能是加密的内容,sub_401000为解密函数,Text为解密后的内容,但第43行给v6赋值为0,导致Text被截断,故而输出不完整。
此时就可以尝试调试得到完整的解密内容。在哪里下断点呢?观察sub_401000函数,第3个参数应该是解密后的内容,转到汇编视图,先在调用sub_401000函数的地址即0x004010E0处下断点
使用x64dbg加载程序,禁用ASLR后再重新加载,方便调试
Ctrl + G,跳转到地址0x004010E0,F2下断点,F9运行程序 运行到地址0x004010E0后,查看右侧函数参数窗口,第3个参数对应的地址会用来保存解密后的内容
右键选择“在 内存窗口 中转到…”
F8步过sub_401000函数,就可以在内存中看到完整的解密内容为“Make the world better!”
一些技巧
断点类型
在例子中用了最常用的软件断点,另外还有硬件断点,内存断点。软件断点利用特定指令实现,会修改程序内容,部分程序会检测自身是否被修改,以此进行反调试;硬件断点借助特定寄存器实现,不会修改程序内容,可以用来反制针对软件断点的反调试;内存断点通过设置内存页属性实现,适用于读写内存断下的情况。
ASLR
ASLR, Address Space Layout Randomization, 地址空间布局随机化 该功能可以让程序加载的基址随机化,提高攻击难度,但调试程序时,随机化的基址会增加调试复杂度,可以用以下方式关闭。
针对整个系统,可以设置如下注册表项:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management] "MoveImages"=dword:00000000
针对单个程序,可以用CFF Explorer、XPEViewer等工具修改相应标志位 IMAGE_NT_HEADERS -> IMAGE_OPTIONAL_HEADER -> DLL Characteristics -> IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
在例子中也提到x64dbg有关闭单个程序ASLR的功能,不再赘述。
切换内存显示方式
x64dbg的内存窗口默认显示十六进制和ASCII字符
可以右键选择 文本->ASCII,只显示字符串
“扩展ASCII”表示宽字节 代码页可以选择其他编码方式,在需要显示汉字时会用到
如果需要切换回默认显示方式,右键选择 十六进制->ASCII 即可
保存内存数据
https://help.x64dbg.com/en/latest/commands/memory-operations/savedata.html
x64dbg提供了savedata命令,需要保存较长的一段数据时很方便。savedata
例子中的解密数据可以用这种方式保存到文件
反反调试
x64dbg自带反反调试功能,可以通过下图的方法打开
Scylla
针对一些加了压缩壳的程序,在把程序调试到OEP(Original Entry Point, 原始入口点)时,x64dbg集成的Scylla工具极大简化了Dump脱壳程序和修复导入表的过程。
一些插件
x64dbg支持很多插件,可以在这里查找安装使用 https://github.com/x64dbg/x64dbg/wiki/Plugins
这里列举一些 x64dbgida https://github.com/x64dbg/x64dbgida 可以和IDA交换符号,方便调试
x64dbgpy https://github.com/x64dbg/x64dbgpy 可以借助python半自动化调试过程
xAnalyzer https://github.com/ThunderCls/xAnalyzer 可以分析补充一些系统API的参数注释,在这方面接近OD的效果,虽然有bug,勉强可以用
分析前
在地址0x00401115上方不远处,右键 xAnalyzer -> Analyze function,
分析后
例子的源码
加入知识星球或知识大陆获取。或加入群聊交流