大家好,欢迎来到IT知识分享网。
1.基本介绍
x64dbg 是一款开源、免费、功能强大的动态反汇编调试器,它能够在Windows平台上进行应用程序的反汇编、调试和分析工作。与传统的调试器如Ollydbg相比,x64dbg调试器的出现填补了Ollydbg等传统调试器的不足,为反汇编调试工作提供了更高效、更可靠的解决方案。正是因为有了这些优点,才能使其成为当今最受欢迎的反汇编调试软件之一。
2.如何启动调试
3.熟悉x64dbg窗口
当被调试程序与调试器之间建立调试关系以后,就可以开始进行动态调试分析了,在x64dbg中有许多的窗口,例如CPU窗口,寄存器窗口,堆栈窗口,十六进制窗口等,如下图所示则是x64dbg运行后的主界面;这里增加一个知识点,关于动态反汇编调试与静态反汇编调试的区别:
- 动态反汇编调试(Dynamic Disassembly Debugging)是指在程序运行时动态地反汇编机器码,从而获取指令级别的执行信息和内存访问情况,以辅助调试和分析程序。动态反汇编调试需要借助特殊的调试工具,如GDB、x64dbg、Ollydbg等,通常用于调试崩溃、死锁、内存泄漏等问题。
- 静态反汇编调试(Static Disassembly Debugging)是指对程序进行反汇编分析,不需要运行程序,只需要对程序进行静态分析就可以获得指令级别的执行信息和内存访问情况,以辅助调试和分析程序。静态反汇编调试需要使用特殊的工具,如IDAPro、Binary Ninja等,通常用于逆向工程、恶意代码分析、漏洞挖掘等方面。
如上图所示,当调试器运行后最大的窗口则是CPU窗体,CPU窗体是x64dbg的默认主窗口,用户所有的调试工作都在CPU窗体中完成,因为CPU窗体就是用于反应当前CPU以及寄存器执行状态的,CPU窗体其内部包含了五个子窗口,分别是反汇编窗口,寄存器窗口,栈地址窗口,十六进制数据窗口,以及堆栈参数解析窗口。
(1)反汇编窗口
反汇编窗口是x64dbg的一个主要功能之一,它可以显示被调试程序的汇编指令,并允许用户查看和修改这些指令(需要注意的是当一个进程被加载默认EIP会停在系统模块中),其主要的作用包括:
- 显示程序的汇编指令:反汇编窗口可以将二进制文件转换为汇编代码,并显示在窗口中。这使得程序员可以深入了解程序的内部工作原理,并且可以查找程序中的漏洞和安全问题。
- 允许用户修改指令:反汇编窗口不仅可以显示程序的汇编指令,还可以允许用户直接在窗口中修改指令。这对于调试和修复程序中的错误非常有用,但需要小心操作,以避免引入新的错误。
- 跟踪代码执行:反汇编窗口还可以跟踪被调试程序的代码执行过程,以便程序员可以了解程序在运行时的行为和状态。这对于调试和优化程序非常有用。
- 显示程序的符号表:反汇编窗口可以显示程序的符号表,这对于程序员来说非常重要,因为它可以帮助他们更好地理解程序中的变量、函数和其他标识符。
(2)寄存器窗口
寄存器窗口则是在调试器最右侧的顶端,该窗口用于显示和解释当前线程环境下CPU寄存器的各种状态值和内容,并且读者可以通过双击这些寄存器组来对其进行动态的调整参数;
| 寄存器 | 描述 |
|---|---|
| EAX | 通用寄存器,用于存放函数返回值、算术运算结果等。 |
| EBX | 通用寄存器,用于存放内存地址或其他通用数据。 |
| ECX | 通用寄存器,用于存放函数参数。 |
| EDX | 通用寄存器,用于存放内存地址或其他通用数据。 |
| ESI | 通用寄存器,用于存放源数据的地址,例如字符串拷贝等操作。 |
| EDI | 通用寄存器,用于存放目标数据的地址,例如字符串拷贝等操作。 |
| EBP | 基址指针,用于存放当前栈帧的基址。 |
| ESP | 堆栈指针,用于存放当前堆栈顶部的地址。 |
| EIP | 指令指针,用于存放当前正在执行的指令的地址。 |
| EFLAGS | 标志寄存器,用于存放CPU的状态标志,例如进位标志、零标志、符号标志等。 |
其中标志寄存器(Flag Register)是一个16位的寄存器,用于存储CPU运算的状态标志,例如进位标志、零标志、符号标志等。下面列出了x86架构CPU中的标志寄存器以及它们的含义:
| 标志位 | 中文名称 | 描述 |
|---|---|---|
| CF | 进位标志 | 当无符号整数加法或减法的结果超出了寄存器的宽度时,该标志位会被设置为1。CF=1表示有进位发生,CF=0表示无进位发生。 |
| PF | 奇偶标志 | 当一个操作的结果中有偶数个二进制位为1时,该标志位会被设置为1。PF=1表示结果中有偶数个1,PF=0表示结果中有奇数个1。 |
| AF | 调整标志 | 当一个二进制算术操作(例如加法或减法)中低4位产生了进位或借位时,该标志位会被设置为1。AF=1表示有进位或借位发生,AF=0表示无进位或借位发生。 |
| ZF | 零标志 | 当一个操作的结果为零时,该标志位会被设置为1。ZF=1表示结果为零,ZF=0表示结果不为零。 |
| SF | 符号标志 | 当一个操作的结果为负数时,该标志位会被设置为1。SF=1表示结果为负数,SF=0表示结果为非负数。 |
| TF | 陷阱标志 | 该标志位用于单步调试,当TF=1时,CPU会在每个指令执行后暂停并等待调试器的命令。 |
| IF | 中断标志 | 该标志位用于控制CPU是否响应中断请求。当IF=1时,CPU允许中断请求;当IF=0时,CPU禁止中断请求。 |
| DF | 方向标志 | 该标志位用于控制字符串操作的方向,当DF=1时,字符串操作是从高地址向低地址进行的;当DF=0时,字符串操作是从低地址向高地址进行的。 |
| OF | 溢出标志 | 当有符号整数加法或减法的结果超出了寄存器的宽度时,该标志位会被设置为1。OF=1表示有溢出发生,OF=0表示无溢出发生。 |
(3)堆栈窗口
在x64dbg最左侧底部则是十六进制窗口,该窗口的主要作用适用于浏览内存,或在特定区域读入或写出数据时使用,在某些时候还可以用来在特定内存区域下断点,以下是一些关于它的主要作用:
- 浏览内存 –
十六进制窗口可以让您直接查看内存中的数据。您可以使用箭头键或鼠标滚轮向上或向下滚动,以浏览更多内存。这对于分析程序的内存布局和查找特定数据非常有用。 - 读入或写出数据 –
可以在十六进制窗口中选择特定的内存区域,并使用右键菜单中的“复制”和“粘贴”选项来读入或写出数据。这对于修改程序的内存状态或在调试过程中注入数据非常有用。 - 设置断点 –
可以在特定的内存地址上设置断点,以便在程序执行到该地址时中断。要设置断点,请在十六进制窗口中右键单击该地址,并选择“设置断点”。
除了以上这些功能外,十六进制窗口还可以显示与特定内存地址相关的汇编代码,并提供许多其他的操作选项,例如搜索内存、转换数据格式等等。
4.断点调试
- 硬件执行断点 –
当程序执行到指定地址时,触发硬件执行断点。这种断点类型适用于在特定指令处调试程序,例如函数调用或跳转指令。在x64dbg中,硬件执行断点可以通过在指令前面的地址上设置“e”来实现。 - 硬件读取断点 –
当程序尝试从指定内存地址读取数据时,触发硬件读取断点。这种断点类型适用于在特定内存位置上调试程序,例如检测某个变量的值何时被更改。在x64dbg中,硬件读取断点可以通过在指定内存地址上设置“r”来实现。 - 硬件写入断点 –
当程序尝试向指定内存地址写入数据时,触发硬件写入断点。这种断点类型适用于在特定内存位置上调试程序,例如检测某个变量的值何时被更改。在x64dbg中,硬件写入断点可以通过在指定内存地址上设置“w”来实现。
(3)内存断点
当程序在特定内存地址处读取、写入或执行时,暂停程序执行。这种断点类型通常用于检测内存访问错误或跟踪特定变量的更改。而一次性断点则是在程序执行到特定指令时只触发一次。这种断点类型通常用于调试复杂代码中的问题,而不是在每次执行到指令时都触发断点。
在x64dbg中,内存断点可以根据不同的操作类型进行分类,内存断点被分为内存访问,内存执行,内存写入,内存读取等,他们之间的应用各不相同;
内存访问断点(Access breakpoint):当程序试图访问特定内存地址时触发,可以用于检测对敏感数据的未授权访问,例如密码、私钥等。
内存执行断点(Execute breakpoint):当程序试图执行特定内存地址处的指令时触发,可以用于检测恶意代码注入、代码劫持等攻击。
内存写入断点(Write breakpoint):当程序试图写入特定内存地址时触发,可以用于检测对敏感数据的修改、防止非法更改程序代码等。
内存读取断点(Read breakpoint):当程序试图从特定内存地址读取数据时触发,可以用于检测对敏感数据的窃取、防止非法读取程序代码等。
(4)消息断点
x64dbg消息断点(Message Breakpoint)是一种特殊类型的断点,可以用于监视程序执行期间的Windows消息,包括键盘输入、鼠标操作、窗口消息等。当程序接收到指定类型的消息时,消息断点会触发,程序执行会暂停,以便进行调试。
消息断点在调试GUI程序时非常有用,可以帮助调试窗口消息的处理代码,定位程序中的错误或异常行为。例如,当你想要调试一个窗口消息处理函数时,可以在该函数上设置消息断点,当程序接收到对应的消息时,程序会暂停在该函数内部,方便进行调试。
5.代码跟踪
(1)反汇编调试命令
在前面的章节中笔者介绍了x64dbg的窗口以及断点的基本设置方法,接下来将介绍x64dbg中的代码跟踪,代码跟踪是任何一个调试器的核心功能,一般而言跟踪功能都会包括,单步步过(快捷键F8),单步步进(快捷键F7),运行到返回(快捷键Ctrl+F9),以及运行到用户代码(Alt+F9快捷键)等常用功能。
在x64dbg中进行代码跟踪可以帮助我们分析程序的执行过程和调试代码,以便更好地理解程序的运行机制。下面是一些常用的代码跟踪功能,及对该功能的解析:
- 单步步过(快捷键F8):该功能用于逐行执行程序,当执行到函数调用时,会直接跳到函数内部执行,而不会逐行执行函数内部的代码。
- 单步步进(快捷键F7):该功能用于逐行执行程序,当执行到函数调用时,会进入函数内部逐行执行代码,直到执行完毕并返回到函数调用处。
- 运行到返回(快捷键Ctrl+F9):该功能用于直接运行程序,直到执行到当前函数的返回语句处停止,并返回到函数调用处。
- 运行到用户代码(快捷键Alt+F9):该功能用于直接运行程序,直到执行到用户指定的代码位置停止,可以通过设置断点来指定代码位置。
在进行代码跟踪时,我们可以在代码窗口中看到当前执行的行和执行指针所指向的内存地址,也可以在寄存器窗口中查看各个寄存器的值,以便更好地理解程序的执行过程。
(2)反汇编检索命令
在x64dbg中,读者可通过Ctrl+F快捷键命令调出命令搜索窗口,并输入一条反汇编指令集,即可实现检索模块内具备的命令位置,当用户勾选整块搜索时,x64dbg会搜寻整个进程内所有匹配的命令,比较遗憾的是x64dbg目前还不支持搜寻多条指令集;
虽然无法搜索连续的汇编指令集,但却可是搜寻二进制字符串,通过快捷键Ctrl+B读者可打开二进制搜索框,我们以如下这条命令为例;
打开二进制搜索框,输入8B FF 55 8B EC即可用于检索上方的指令片段,也算是一种折中的方法;
同时x64dbg还支持搜索字符串,通过右键菜单即可调出搜索框,并实现特殊字符串的检索;
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/117059.html








