这篇文章主要来说一下x96dbg(x64/x86)的基本使用,这里还是使用上篇文章中的简单程序用来作为本篇文章的实例,因为上篇文章再生成程序时选用的解决方案平台为x86
所以生成的程序则需要我们使用x32dbg
来进行分析。
这边与IDA一样,我们可以将程序拖到图标上。
此时x32dbg
就会自动针对该程序进行加载,接下去我们就可以进行调试了。在加载完成后可以看到调试器下方显示已暂停,已到达系统断点!
。
这个系统断点通常指的是调试器在程序启动时自动设置的第一个断点,也称为Entry Point
断点。系统断点发生在程序的入口点(Entry Point)之前,通常是在加载器(loader)将程序从磁盘加载到内存之后,操作系统会在这里插入一个INT 3
指令,目的是让调试器能够在程序执行之前有机会设置它自己的断点和初始化调试环境。这个断点可以理解为程序正式开始执行前的一个暂停点,允许调试器做一些初始设置。在调试器中看到系统断点时,程序还没有真正开始执行,它只是在操作系统初始化和程序准备运行的阶段。你可以选择继续执行程序,跳过系统断点,进入程序的实际入口点,从而开始分析程序的实际代码。
功能组件
1.反汇编窗口
x64dbg的反汇编窗口是一个非常重要的工具,它用于查看和分析程序的汇编代码,且显示了当前调试中的程序的机器代码和对应的汇编指令,这些指令是程序运行时CPU执行的低级操作。
在第一个区域的最左侧这一列就是内存地址区域,接着中间部分就是汇编指令的opcode,右侧这一列就是汇编代码区,最后有一个空白的地方,我们可以在这个位置输入一些注释;x96dbg
添加注释的方式与IDA
一致,选择要添加注释的位置,接着敲;
对注释文本进行编辑,选择OK即可。
2.寄存器窗口
x64dbg 的寄存器窗口是一个用于查看和修改 CPU 寄存器内容的窗口。在调试过程中,寄存器窗口对于理解程序的执行状态和控制程序的执行流程至关重要。
寄存器窗口显示当前 CPU 寄存器的内容,包括通用寄存器(如 RAX
, RBX
, RCX
, RDX
等),指令指针寄存器(RIP
),栈指针寄存器(RSP
),以及基址指针寄存器(RBP
)等。在 x64dbg 中调试 64 位程序时,会显示 64 位寄存器;如果调试 32 位程序,则显示 32 位寄存器。
3.内存窗口
x64dbg 的内存窗口用于查看和操作目标程序的内存内容。
内存窗口显示的是程序当前内存的十六进制内容和其对应的 ASCII 文本表示。每一行通常显示一个内存地址的起始位置,以及接下来的若干字节数据。
4.堆栈窗口
堆栈窗口用于查看和分析程序在运行过程中使用的堆栈数据。堆栈是程序执行过程中临时存储数据(如函数参数、返回地址、局部变量等)的区域。
基本调试方法
①F2:设置断点
②F4:运行到光标处
③F7:单步步入(遇到call
指令,进入call
函数的实现处继续执行汇编指令)
按下F7后则跳入ntdll.773C034
函数的实现处继续执行汇编指令
④F8:单步步过(遇到call
指令,执行call
函数,之后接着执行call
指令的下一条指令)
按下F8后则接着执行call
指令的下一条指令,即不进入函数中进行命令执行。
⑤F9:运行程序(如果没有碰到断点,程序会一直执行到结束)
⑥Ctrl+F9: 执行到函数返回处,用于跳出函数实现
⑦Alt+F9:执行到用户代码,用于快速跳出系统函数
⑧Ctrl+G:输入十六进制地址,快速定位到该地址处
搜索字符串
右击->搜索->所有模块(当前区域/当前模块)->字符串
【注】关注GZH回复"x96"获取x64dbg/x86dbg工具,以及其他网络安全相关书籍