这一章是静态分析技术。高级语言编写的程序一般有两种形式,一种是被编译成机器语言在CPU上执行,例如C++,机器语言与汇编语言相对应。因此可以将机器语言转化成汇编语言,这个就叫反汇编。另一种是一边解释一边执行,我们称之为解释性语言,例如visual basic3.0/4.0,java。这类语言变异的程序可以被还原成高级语言的原始结构,这是反编译。
所谓静态分析,是通过反汇编,反编译获得程序汇编代码或者源代码,再根据程序清单分析的程序的流程,了解模块所完成的功能。
文件类型分析
逆向分析程序的第一步是分析程序的类型,了解他使用什么语言,什么编译器,有有没有被加密处理过。这个分析过程一般用工具。有peid,exeinfoPE。可以检测大多数编译语言,加密和病毒。本节用peid。
peid可以检测大多数编译语言,病毒和壳。
peid这类分析工具利用特征串搜索完成识别工作。因为各种开发语言都有固定的启动代码,可以用来识别。加密处理过的程序会留下加密软件的相关信息,利用这点可以识别他是用什么加密软件。
peid提供一个扩展接口文件userdb.txt,永华亏自定义一些特征码用于识别新的文件类型。
有些外壳程序会为了欺骗识别软件,将一些加壳信息去除,并伪造启动代码。所以识别工具的结果只做参开,具体如何需要跟踪分析代码。
反汇编引擎
安全软件和保护软件的开发过程中经常会用到汇编引擎和反汇编引擎。
ODG的ODDisam
这是ODG自带的反汇编引擎,优点是具有汇编接口(文本解析,将文本字符串解析并编码成二进制值)。也有很多缺点如下
BeaEngine
没有明显缺点,指令集如下。
有一个特点是可以解码每一条指令使用和影响的寄存器,包括标志位寄存器,深知解码标志位寄存器的所有位置。
Udis86
支持的x86扩展集如下。
此外还支持x64指令的反汇编。它的代码精简功能函数短小,变量命名接口干净,简单,灵活。
这也使得他拥有强大适应能力的同时兼顾了性能,解码细节和能力相近时,它是解码速度最快的反汇编引擎。
Capstone
是集大成者。支持很多种CPU框架。
Capstone对x86架构指令集支持最全。有
也很适合用来移动端开发。
因为他是从llvm移植过来,而llvm是C++项目,capstone是c语言项目。做了很多适配,显得他很臃肿。capstone通过适配接口将其转换到自己的架构,也造成了解码时中间层过多,性能下降。
此外,capstone的内存消耗比较大,解码一条指令传入的架构cs_insn必须要动态分配函数来分配,而且要分配两次,造成了巨量的内存碎片。所以要是用Capstone进行大量指令分析,最好给他分配一个固定的对象内存分配器,提高一点性能。
粽子Capstone接口使用繁琐,但功能强大。