1 前言
前面了解的都是一些比较空洞的概念,现在看不明白也并不要紧,因为后面在逆向分析中我们还会多次遇到。
遇到的多了,其实也就自然而然的懂了,这些不过都是熟能生巧罢了。
从本文开始,我们就正式进入逆向分析阶段了,首先要介绍的是动态分析。
所谓动态分析,就是让程序处于运行的情况下进行分析,是最常见的分析手段。
动态分析需要用到专业的软件,常用的软件有:OllyDbg、x64dbg、WinDbg。
这些分析软件各有优缺点,但就目前来看,OllyDbg有点脱离时代了,个人并不推荐。
其中x64dbg是一款开源软件,界面美观,功能强大,推荐使用。
而WinDbg是微软官方推出的一款非常强大的调试器,常结合命令使用,可以作为进阶工具,可用来调试整个windows系统。
本文将以x64dbg
这款软件作为入门工具。
2 下载x64dbg
它是一个开源工具,可以直接去其github官网下载:x64dbg。
就是这个压缩包,下载下来就可以了,如果你无法访问的话,也可以点击这里去下载。
解压后有两个文件夹和一个文件:
其中可执行文件就在release
文件夹中:
前面我们一直就在说,有32位和64位这两种程序,所以这里的调试器也分为两种,你可以分别在x32文件夹和x64文件夹中找到。
但最简单的方式还是直接运行当前目录下的这个x96dbg
可执行文件。
这个可执行文件就是一个启动器,点击运行它后,如果是第一次会让你选择一些配置信息,随便选就行了。
然后就可以选择你想要启动的调试器版本:
这就取决于你想要调试的程序位数了,这里以x32dbg
为例:
至此,我们的调试工具就安装完成了,这里面的界面很复杂,后面慢慢介绍。
3 第一次逆向
现在想在网上找一个入门的学习的逆向程序也当真不好找,所以我这里就直接自己写一个吧。
点击这里下载即可,这是我用MFC写的一个很简单的程序,为32位:
将其运行起来之后,可以从任务管理器中看到。
我们现在的目标就是逆向它,达到登录的目的。
并且注意,这里的密码并不是固定不变的,而是根据你输入的账号计算来得到对应密码的,这种就属于在程序运行过程中得到密钥,一般就会进行动态分析。
嗯……本来是想用一些算法来计算这个密钥,但想了想又感觉太麻烦了,毕竟这里仅仅是教大家如何入门而已,所以本程序并没有采用算法,而仅仅是进行了简单的字符串拼接得到最终的密钥,所以即使是用静态分析应该也能直接看出来。
登录错误时:
登录成功时:
3.1 逆向分析
这就是程序的全部内容,现在可以将其关闭掉,然后打开32位的调试器,直接将这个TraceMe.exe
程序拖进来即可:
此时默认程序就会被断下来,也就是进行调试状态,这和VS中的调试其实差不多,只不过vs调试的C/C++代码,这里调试的是汇编代码而已。
这里首先我们看到的主页面是CPU页面,这个页面中显示的就是CPU当前将要执行代码所处的地址和数据,也就是上图中的第一列和第二列,我也写了注释。
至于第三列与第四列则是这个软件的功劳,它将这些机器码翻译成为了反汇编代码,也就是第三列,并且还能给出一点注释,也就是第四列中的内容。
然后还需要注意的是软件左下角的通知信息,目前处于系统断点下,这是程序的默认设置,也就说当前程序启动后,是会先运行系统级代码,也就是第一章我们提到的32位后2G地址空间的代码。
这里面的代码我们是不能更改的,也就是只读的,一般大家也称这种状态为:系统领空。
从上面的代码地址也能看出来,这些数据都位于地址77977900
左右,4G地址的一半是7FFFFFFF
,这里的代码依旧是在这一半之前,怎么是系统代码呢?
这里要注意按一半分只是理论情况,有时候系统代码在地址空间不够用或者其它情况下,也会占用用户地址段。
区分当前是否为系统领空更直接的办法是看当前代码所处的模块,也就是此时程序的标题:
这个ntdll.dll
熟悉不?这也是第一章提到过的,这就是一个典型的系统模块。