主机C:\Reverse\1目录下有一个CrackMe1.exe程序,运行这个程序的时候会提示输入一个密码,当输入正确的密码时,会弹出过关提示消息框,请对CrackMe1.exe程序进行逆向分析和调试,找到正确的过关密码。
1、 使用PEiD扫描
通过对CrackMe1.exe程序的观察,我们知道程序需要输入一个密码,当不输入任何数据就点击按钮时,提示如下信息:
随便输入一些测试数据字符后,提示错误:
通过这些操作后,猜测程序的意图是输入一个正确的密码。
对一个程序进行逆向分析之前,除了程序的动态行为之外,查看程序是否加壳(被何种程序加壳?是什么编译器编译的?)也是一个非常关键的步骤。选中程序后单击右键,在右键菜单中选择“Scan with PEiD”选项,就可以查看加壳信息了。
看到的是Microsoft Visual C++ 6.0,说明CrackMe1.exe没有加壳,且它是使用VC6编译的。
2、使用OD调试:
动态调试可以帮助了解程序内部执行逻辑的许多详细信息,很多信息只有在程序运行起来之后才会看到,这也是静态分析所无法简单获取到的。OD是我们在Windows操作系统下动态调试器的首选。
选择CrackMe1.exe程序后单击右键,在右键菜单中选择“用OllyICE”打开,就会进行OD调试器的主界面,在反汇编指令列表窗口中单击右键,依次选择“Ultra String Reference”、“Find ASCII”菜单项,如图所示:
会弹出字符串列表窗口,这个窗口列出了当前进程内存空间中存在的各种字符串,查看是否存在有我们感兴趣的字符串。可以按下Ctrl+F,在弹出的窗口中输入查找信息。
其中发现提示:密码正确,密码错误等信息:
双击密码错误这行,出现:
在这个代码片段中,还看到了一个jnz跳转指令,这个指令是否跳转将决定着弹出成功的提示还是弹出失败的提示,这样的跳转也就是所谓的关键跳转。在关键跳转之上的代码往往就是关键的密码判断逻辑,因此可以着重分析关键跳转之上的代码。在关键跳转之上,我们在下面的位置下一个断点。
可选择该行点击右键选择断点——>切换。或者鼠标单击这行代码选中,然后按下F2。
下好断点之后,按下F9运行程序,打开CrackMe1.exe程序,随便输入一个密码(比如test)后单击按钮,程序就自动在断点断下了。
然后F8开始进行单步跟踪,当跟踪到00401490的时候,发现了输入的密码test,同时发现字符串HeeTianLab,如图所示:
分析代码,发现是在从这两个字符串里面取出字符一个一个进行对比,只要有一个字符不一样,最终都会跳转到提示失败的地方去。
可以猜测HeeTianLab就是正确的密码了,运行另一个CrackMe1进程,输入HeeTianLab,弹出成功提示:
3、使用IDA静态分析
除了动态调试之外,静态分析也是一种很重要的技能。静态分析可以帮助我们快速了解程序的代码执行逻辑,尤其是使用IDA的Hex-Rays插件将汇编代码生成伪代码的功能,可以极大地提高我们的分析效率。
使用IDA打开CrackMe1.exe程序,运行IDA——> go——>File——>open——>选中CrackMe1.exe打开——>点击ok.IDA会提示选择文件类型、处理器类型等,通常不需要修改这些设置,直接单击“OK”按钮即可。
之后IDA会对程序进行分析,等待一段时间,待分析结束之后,在下方的“Output Window”中会提示“The initial autoanalysis has been finished.”,如图:
在IDA的菜单中选择“View”——“Open subviews”——“Strings”菜单项,就可以弹出字符串列表界面了:
IDA的字符串列表界面没有提供Ctrl+F快捷进行查找的功能,所以需要手工翻页来查找我们感兴趣的字符串,拖到某一个地方的时候看到了提示相关的字符串:
双击“密码错误”这个字符串,来到定定义该字符串的地方,然后鼠标点击字符串的名字(红框框住的),然后按下x键,进行交叉引用查找,弹出的对话框如下图所示:
单击OK按钮来到引用这个字符串的地方,然后看到了一堆反汇编指令列表。
对这里的汇编指令进行分析,如果不想看汇编指令,按下F5键就可以生成函数的伪代码了,可以看到伪代码中将输入的密码和HeeTianLab进行了比较(strcmp()函数比较字符串中各字符串的ASCII码,字符串都相等,返回0):
所以,HeeTianLab就是寻找的密码。
4、总结:
查找逆向分析的基本方法,包括OD、IDA、PEiD等工具的使用,以及基本的动态调试跟踪能力,基本的静态分析能力,通过动态调试或者逆向分析找到密码。