1. 逆向工程
逆向工程(RE,Reverse Engineering)是一种技术过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能性能规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是,在不能轻易获得必要的生产信息下,直接从成品的分析,推导出产品的设计原理。
2. 基本概念
机器码(Machine Code):电脑CPU可直接解读的数据,也被称为原生码(Native Code),与运行平台有关。
汇编语言(Assembly Language):用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址,方便程序员编写代码。汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。主流的有ARM汇编和x86汇编。
CPU寄存器:用来暂时存储指令、数据和地址,包括通用寄存器、专用寄存器和控制寄存器。逆向分析时需要注意特殊寄存器的变化。
WinAPI:Windows 操作系统中可用的内核应用程序编程接口,在 Windows 平台研究学习逆向工程需要了解一些WinAPI编程。
3. 反汇编
反汇编是把目标代码转化为汇编代码、将低级代码转化为高级代码的过程。
以最著名的HelloWorld为例,先在Visual Studio中新建一个HelloWorld项目如下所示。
在生成→配置管理器→活动解决方案配置选择Release。选择Release模式生成可执行文件,程序代码会更简洁,方便调试,如图1所示。
图1 Release模式
此时生成的是HelloWorld.exe的可执行文件,已经不能直接看到程序的源码。通过该可执行文件还原出汇编代码的过程就是反汇编。我们用OllyDbg加载该程序可以轻松地看到反汇编代码,如图2所示。
图2 反汇编代码
4. 常见的工具
OllyDbg是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,已代替SoftICE成为当今最为流行的调试解密工具。同时还支持插件扩展功能,是目前最强大的调试工具。运行界面如图3所示。
图3 OllyDbg运行界面
IDA Pro 32/64:IDA Pro简称IDA(Interactive Disassembler),是一个世界顶级的交互式反汇编工具,有两种可用版本。标准版(Standard)支持20多种处理器,高级版(Advanced)支持50多种处理器,运行界面如图4所示。
图4 IDA Pro运行界面
SoftIce:SoftIce是Compuware NuMega公司的产品,是Windows2000及之前的内核级调试工具,兼容性和稳定性极好,可在源代码级调试各种应用程序和设备驱动程序,也可使用TCP/IP连接进行远程调试。但目前微软的Windbg方便性、可靠性及可用性远远超出SoftICE,且免费使用。所以SoftIce并没有推后续版本。
WinDbg:WinDbg 是在 Windows 平台下,强大的用户态和内核态调试工具。相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能,却比Visual Studio更为强大。它的另外一个用途是可以用来分析Dump数据,程序运行如图5所示。
图5 WinDbg运行界面
5. 分类识别工具
在第一次拿到一个文件时,我们需要确定这是一个什么类型的文件。通常可以通过文件扩展名确定。有时候文件扩展名并没有什么实际意义,所以不能通过扩展名来确定文件类型。
(1)file
在大多数 Linux 系统中都带有这个实用工具。file 通过检查某些特定字段来确定文件类型,如下。
常见命令:file[-bchikLnNprsvz][-f namefile][-F separator][-mmagicfiles]file。命令参数及描述如表1所示。
表1 file命令参数及描述
(2)PE tools
PE tools用于分析Windows系统中正在运行的进程和可执行文件,主界面如图6所示,列出了所有活动进程和每个进程调用的动态链接库。
图6 PE tools主界面
(3)PEiD
PEiD 是一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470种PE文档的加壳类型和签名,运行界面如图7所示。
图7 PEiD运行界面
6. 摘要工具
一般情况下,我们可以获得的都是二进制程序文件,所有也只能对二进制程序进行逆向。在对文件有了初步的了解和分类后,需要对特定的文件格式进行解析。
(1)nm
nm是names的缩写。nm命令主要是用来列出某些文件中的符号,如一些函数和全局变量。在Linux下面重新编译生成了Helloworld,用nm命令分别查看效果,命令:nm Helloworld,运行如下。
输出字符含义如表2所示。
表2 输出字符含义
(2)ldd
ldd(List Dynamic Dependencies)是Linux上自带的脚本,用来列出可执行文件所需的动态库。命令:ldd Helloworld。
(3)Objdump
Objdump 是一个十分强大的工具,可以灵活地查询文件的各种信息,有大概 30个可选项,可以通过objdump –help查询。简单查看反汇编代码使用如下:Objdump-d helloworld,运行部分如下。
(4)Otool
可以获取OS X二进制文件的相关信息。类似objdump的实用工具。
(5)Dumpbin
微软VisualStudio工具套件里的一个命令行工具。主要用于Windows PE文件相关信息的获取。用法类似Objdump。
7. 深度检测工具
strings实用工具专门用于提取文件中的字符串内容,通常使用该工具不会受到文件格式的限制。使用strings的默认设置(至少包含4个字符的7位ASCII序列)。用strings对Helloworld进行检测,部分代码如下。