引言
当我们仅有一个C/C++等编译的可执行程序(windows 上的 exe 文件),而没有源码时我们应该怎么分析调试该可执行程序呢?我们可以通过动态分析或静态分析的方式达成我们的目的,当然比较有效的方案当然是静态分析结合动态分析的方式。在静态分析中常使用IDA等工具进行分析,在动态分析时我们常使用 OllyDbg、windbg、x64dbg等进行分析,OllyDbg后面已经不在维护了,仅支持32位程序,windbg上手难度比较高,所以本次我们介绍 x64dbg 工具的使用。
工具的下载与安装
首先我们要学习使用 x64dbg 当然要先下载安装该工具,该工具是绿色免安装的,我们可直接访问官方地址 https://x64dbg.com/ 进行下载,下载后是一个压缩包文件,我们进入解压后的目录中,找到 x96dbg.exe 文件,双击运行,运行后我们可以选择点击安装,按照操作提示安装即可。当然我们也可以不安装直接运行。
该工具安装后会在桌面创建两个快捷方式,同时也会在鼠标右键菜单中添加快捷菜单。
调试
打开进程
要想调试程序我们先要打开程序,x64dbg 有连个独立的程序x32dbg和x64dbg,分别用于调试windows的32位和64位程序,我们需要使用对应的程序进行调试
直接打开程序
首先要介绍的第一种打开方式是直接打开程序,我们可以找到我们要调试的程序,单击鼠标右键,选择x64dbg直接进行调试,也可以先打开x64dbg,然后选择文件->打开,然后选择我们要调试的程序,当然直接拖进来也是可以的。
附加到现有进程
第二种调试方式是附加到现有进程,当程序已经在运行状态时,我们可以打开工具,然后点击 文件->附加 选择要调试的进程进行附加调试
页面介绍
程序打开后我们可以看到如下页面
最大的窗口是反汇编窗口,用于显示当前的反汇编内容,它下面的是内存窗口,可以通过地址查看内存中的数据,它右边的是寄存器窗口,用于显示当前寄存器中的值,寄存器窗口下面是栈窗口,用于显示当前栈内的数据
调试
要调试我们最常用的首先就是添加断点,在反汇编窗口中找到我们要添加断点的位置,然后按 F2 键即可添加断点,再次按F2键即可取消断点
步过,所谓的步过就是单步执行,遇到调用指令时不会进入调用的函数的内部,我们可以通过 F8 键使用步过
步进,所谓的步进和步过的区别就是在遇到调用指令时会进入到所调用的函数内部
继续执行可以按 F9,程序会在遇到下一个断点或出现异常时再次停下来
内存布局
按 Alt + M 可以切换到内存布局页面,在此页面中我们可以看到各个模块以及各个段的加载地址
符号
按 Alt + E 可以切换到符号页面,在该页面中我们可以单机模块,在右侧中查看内部的符号信息,同时我们也可以在此页面对符号进行搜索,找到我们需要调试接口
对于windows提供的系统库我们可以通过鼠标右键下载对应的符号信息文件
调试技巧
通过上面的介绍我们初步了解到了工具是如何使用的,这里并没有长篇大论仅把最常用最基础的功能告诉大家,因为写的太长了我自己都不愿意看;接下来给大家介绍一些简单的调试技巧
通过UI信息找到调试位置
我们在调试时很大的一个困难就是我们不知道哪里才是我们想要调试的部分,那应该怎么办呢,首先第一种方法是通过UI的界面提示找到我们要调试的位置
比如我们在输入授权码时的错误提示信息,我们可以根据上面的字符串找到我们要调试的位置
要搜索字符串我们可以在CPU页面的反汇编窗口中单机鼠标右键,选择搜索,然后根据需要选择搜索范围,最后点击字符串,接下来我们就可已在下面输入我们发现的字符串进行搜索了
找到目标字符串后我们通过双击即可跳转到使用的位置了,这样我们也就找到了对应位置的代码了
通过系统接口进行定位
我们可以通过一些关键的系统接口进行定位,思路是我们根据目标程序的行为进行初步判断,判断它可能调用了哪些系统接口,比如创建文件?写入文件?弹出对话框等等等等,猜到了程序调用的系统接口后我们就可以在符号页面找到对应的系统接口,然后通过单机跳转到反汇编,添加断点进行调试,这样当程序调用该接口时就会触发断点,我们也就可以根据调用堆栈找到对应的逻辑了
防止调试分析
我们的程序经常不想让用户进行分析,因为通过简单的分析就可以知道我们程序的逻辑,核心算法,还可以对我们的程序进行修改和破解,那我们应该如何进行访问呢?
答案就是加壳,使用 Virbox protector 工具进行加壳后就可以防止其他人对我们的程序进行恶意分析和修改了,我们可以禁止其调试我们的程序,还可以对我们的程序进行和保护,让其无法分析出我们的逻辑,同时还可以对程序内部的字符串等信息进行加密的等等