1.1 先来实际体验一下软件分析吧
下面我们就来动手尝试一下逆向工程。
“咦?你还什么都没教呢!”
没关系,也许大家印象里觉得逆向工程是很难的,其实这里面有一半是误会,因为分析的难度取决于你要分析的对象。有些软件很难进行分析,但也有一些则很容易。
这里我们准备了一个简单的“恶意”程序,然后从下面三个要点来进行分析。
●文件的创建、修改和删除
●注册表项目的创建、修改和删除
●网络通信
如果我们能对上述三个方面进行监控,那么就不难跟踪软件的行为。
这里我们需要下面三个工具。
●Stirling(二进制编辑器)
http://www.vector.co.jp/soft/win95/util/se079072.html
●Process Monitor(文件和注册表监控)
http://technet.microsoft.com/en-us/sysinternals/bb896645
●Wireshark(网络监控)
我们先启动Process Monitor和Wireshark,修改配置以启用日志输出。
本书中的所有示例文件均可从以下地址下载。
https://github.com/kenjiaiko/binarybook
本次的分析对象为chap01\sample_mal\Release目录中的sample_mal. exe文件,请大家运行这个文件。
运行sample_mal.exe后,应该会弹出一个内容为“Hello Malware!”的对话框。
关闭对话框之后,sample_mal.exe文件本身也会消失。
1.1.1 通过Process Monitor的日志来确认程序的行为
下面我们来看一下Process Monitor的日志。
▼Process Monitor的运行结果(文件访问)
通过跟踪Process Monitor的日志,我们可以发现程序在以下位置进行了CreateFile操作。
● C:\Documents and Settings\XPMUser\‘开始’菜单\程序\启动\0.exe
※Windows XP的情况。
● C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\0.exe
※Windows Vista及更高版本的情况。AppData为隐藏文件夹。
存放在“启动”文件夹中的程序,会随着Windows启动自动运行。
请大家注意,我们的示例程序连续执行了CreateFile、WriteFile和CloseFile这几个操作,这些操作加起来的功能相当于“在指定文件夹创建并写入一个名为0.exe的文件”。
我们来实际确认一下。
▼确认“启动”文件夹中的内容
果然和日志所描述的一样,创建了一个0.exe文件。
下面我们用二进制编辑器Stirling对比一下0.exe和sample_mal.exe的内容。在菜单中点击搜索/移动→比较,在弹出的窗口中选择比较对象,点击OK即可。
通过对比我们发现,两个文件的内容完全一致,也就是说,程序将自己复制了一份。
▼用Stirling对文件进行对比(在菜单中点击搜索/移动→比较)
由于“启动”文件夹中的程序会在Windows启动时自动运行,因此当我们重启Windows时,0.exe就会被运行。这个程序并不会带来什么实际的危害,所以大家可以重启系统试试看。
1.1.2 从注册表访问中能发现些什么
下面我们来确认一下注册表的访问情况。
Process Monitor会列出程序访问过的注册表项目和文件。注册表是Windows系统提供给应用程序的一个用于保存配置信息的数据库,其中保存的数据包括浏览器设置、文件类型关联、用户密码等。
通过查看Process Monitor输出的日志,我们可以知道程序向“启动”文件夹复制了一个文件。
进一步分析日志,我们还可以发现程序对注册表进行了一些可疑的访问。
▼Process Monitor的运行结果(注册表访问)
看来程序在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Run中创建了一个名为sample_mal的注册表项目。
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Run和“启动”文件夹一样,其中注册的程序会在Windows重启时自动运行。
Windows重启时自动运行的程序可以注册在下列任一注册表的位置。
●HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
●HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
●HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
●HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
此外,我们发现程序还在C:\Documents and Settings\XPMUser\My Documents目录下,也就是“我的文档”文件夹下创建了一个名为1.exe的文件。
▼确认“我的文档”文件夹的内容
和0.exe一样,1.exe也是sample_mal.exe的一个副本。
由于1.exe的路径已经被注册在注册表HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Run下面,因此当Windows启动时就会自动运行1.exe。
下面我们来看一下Windows注册表的内容。使用Windows自带的regedit工具就可以查看注册表,点击开始菜单→运行,输入regedit即可。
▼确认注册表内容
可以发现注册表里面的确注册了C:\Documents and Settings\XPMUser\My Documents\1.exe这样的内容。
因此,如果我们删除0.exe和1.exe,那么Windows重启时就不会再运行sample_mal.exe了。
其实,sample_mal.exe只会弹出一个Hello Malware!的对话框,并没有进行其他任何操作。因此,我们只要将“启动”文件夹、“我的文档”以及注册表中新增的内容(文件路径)删除,系统环境就可以完全恢复原状了。
1.1.3 什么是逆向工程
通过上面的结果我们可以发现,sample_mal.exe程序会执行以下操作。
●修改注册表以便在系统重启时自动运行
●将自己复制到“启动”文件夹以便在系统重启时自动运行
由于程序没有进行网络通信,因此我们暂时不需要用到Wireshark。
当然,由于在一开始我们不知道要分析的软件具体会执行怎样的操作,因此应该尽可能地收集完整的操作日志,对于不需要的部分只要放着不用就好了。
像上面这样对软件进行分析并搞清楚其行为的工作就是“逆向工程”。逆向工程是指一般意义上的软件分析,其对象不仅限于恶意软件,因此也不一定和计算机安全有关。
逆向工程原本是指通过拆解机器装置并观察其运行情况来推导其制造方法、工作原理和原始设计的行为,但在软件领域,逆向工程主要指的是阅读反汇编(将机器语言代码转换成汇编语言代码)后的代码,以及使用调试器分析软件行为等工作。
一直以来,在计算机病毒分析、防止软件非法使用的防拷贝技术,以及评估软件强度的抗篡改测试等领域都会用到逆向工程技术。一般认为,和软件开发所使用的编程技术相比,逆向工程属于另一种完全不同的技能。此外,由于逆向工程常常被用于恶意软件分析、防拷贝等领域,因此也经常被归为安全技术的一种。
专栏:逆向工程技术大赛
在一些国家,政府和民间社区会举办一些以CTF(Capture the Flag)为代表的逆向工程技术大赛,以推动信息安全技术的发展。
● SECCON CTF(日本)
● DEFCON CTF(美国)
http://www.defcon.org/html/defcon-20/dc-20-ctf.html
● CODEGATE CTF(韩国)
近年来,随着需求的不断增加,世界各地都开始开展各种安全竞赛活动。这些竞赛基本上都是通过线上预赛选出成绩最好的10~20个队伍进入决赛。
尽管很多比赛的水平很高,但比赛本身也十分有趣,有兴趣的话去参加一下也未尝不可。