读书频道 > 软件开发 > C++ > C++反汇编与逆向分析技术揭秘
1.2 反汇编静态分析工具IDA
2013-07-12 10:42:04     我来说两句 
收藏    我要投稿   
本书既是一本全面而系统地讲解反汇编与逆向分析技术的安全类专著,又是一部深刻揭示C++内部工作机制的程序设计类著作。理论与实践并重,理论部分系统地讲解了C++的各种语法特性和元素的逆向分析方法和流程,重在...  立即去当当网订购

所谓“静态分析”,是相对于上面所提到的“动态分析”而言的。在“动态分析”过程中,调试器加载程序,并以调试模式运行起来,分析者可以在程序的执行过程中观察程序的执行流程和计算结果。但是,在实际分析中,很多场合不方便运行目标,比如软件的某一模块(无法单独运行)、病毒程序、设备环境不兼容导致无法运行……那么,在这个时候,需要直接把程序的二进制代码翻译成汇编语言,方便程序员阅读。像这样由目标软件的二进制代码到汇编代码的翻译过程,我们称之为“反汇编”。OllyDBG也具有反汇编功能,图1-1中的标号3便是OllyDBG的反汇编窗口,但OllyDBG是调试工具,其反汇编辅助分析功能有限,不适用于静态分析。

本节将介绍辅助功能极为强大的反汇编静态分析工具—IDA。它的图标是被称为“世界上第一位程序员”的AdaLovelace的头像,中文名为阿达。本书中使用的IDA版本为5.5英文版。成功安装IDA后,会出现两个可执行程序图标,一个是黑白的阿达头像,另一个是在阿达头部写有“64”字样的头像,它们分别对应于32位程序和64位程序的分析,本节分析的程序全部为32位。

IDA窗口中的工具条、菜单选项较多,初学IDA时只要掌握基本操作功能即可。IDA的常用快捷键使用说明如表1-2所示。


 

使用IDA静态分析1.1节中的调试程序“Helloworld”,通过实例进行简单的操作分析,进一步学习IDA的基本使用方法。

(1)加载分析文件

IDA加载分析文件后,会询问分析的方式,有3种分析方案供选择,如图1-7所示。

 

Portableexecutablefor80386(PE)[pe.ldw]:分析文件为一个PE格式的文件

MS-DOSexecutable(EXE)[dos.ldw]:分析文件为DOS控制台下的一个文件

Binaryfile:分析文件为一个二进制文件

根据分析文件的格式进行选择,本示例为一个PE格式文件,故选择第一种分析方式,单击“确定”按钮,分析结束后,IDA默认情况下会显示流程视图窗口。

(2)认识各视图功能(如图1-8所示)

 

视图窗口说明:

IDAView-A:分析视图窗口,用于显示分析结果,可选用流程图或代码形式。

HexView-A:二进制视图窗口,打开文件的二进制信息。

Exports:分析文件中的导出函数信息窗口。

Imports:分析文件中的导入函数信息窗口。

Names:名称窗口,分析文档中用到的标号名称。

Functions:分析文件中的函数信息窗口。

Structures:添加结构体信息窗口。

Enums:添加枚举信息窗口。

(3)查看分析结果

“Helloworld”反汇编分析示例如图1-9所示,图中为IDA分析后的反汇编代码,将其拷贝到汇编IDE中,只要稍加修改,就可以进行编译和连接。IDA的数据查询非常简单,只需要双击标号,即可跟踪到该数据的定义处。查看函数实现的方式也是如此,比如,如果需要返回调用处,只需按Esc键即可返回。由于有IDA的帮助,使得将一个二进制文件还原成等价的C\C++代码的难度大大降低。

 

(4)切换反汇编视图与流程视图

图1-9中的反汇编代码是从IDA的反汇编视图中提取的。IDA的默认视图为流程视图,需要进行转换。在函数体内,右击选择Textview。同理,如果要从反汇编视图切换回流程视图,可选择Graphview。流程视图(Graphview)使得程序的流程结构和工程量的分析变得异常容易。

(5)IDA函数名称识别

在图1-9中,IDA可以识别出函数MessageBoxA及其各参数的信息,IDA通过SIG文件来识别已知的函数信息。在安装IDA的同时,已将常用库制作为SIG文件放置在了IDA安装目录中的SIG文件夹下。利用此功能可识别出第三方提供的库函数,从而简化分析流程。

SIG文件的制作有3个步骤(使用前需设置环境变量路径)。

1)从LIB文件中提取出OBJ文件

使用IDA加载LIB文件,此时会显示此文件中的OBJ文件信息(如图1-10所示),使用link.exe连接器将从LIB文件中生成出OBJ文件。在控制台下使用link命令,如下:


link-lib/extract:[Filename][Libname].lib

指令说明如下:

[Filename]:见图1-10中Filename一列中名称。

[Libname]:Filename所属LIB文件的名称,此示例为libc。

使用此命令依次可将libc.lib中所有的OBJ文件提取出来。

2)将每个OBJ文件制作成PAT文件

OBJ文件中包含函数的名称和对应实现代码的二进制机器码。在PAT文件的制作过程中,会提取出这些二进制机器码的特征,并将二进制机器码的特征码及对应函数的名称保存在PAT文件中。特征码就好像是人的五官,我们可以根据耳、鼻、眼等这些人体特征来识别一个人的身份。每个函数就好像一个独立的人,有各自的不同之处。如果某个文件中拥有这些特征信息,便可确认此文件使用了这个OBJ,并可以借此识别函数名称。OBJ生成PAT时使用的是pcf.exe(见随书文件)。在控制台下使用pcf命令,如下:
pcf[Objname].obj

指令说明如下:
[Objname]:OBJ文件名称。

3)多PAT文件联合编译SIG文件

一个SIG文件是由一个或多个PAT文件编译而成的。在生成SIG的过程中,如果多个PAT文件中有两个或两个以上的函数特征码相同,将会过滤掉重复特征,只保存一份。在控制台下使用sigmake.exe将PAT文件编译成SIG文件,使用格式如下:
sigmake[Patname].pat[Signame].sig

指令说明如下:

[Patname]:PAT文件名称。当多个PAT文件参与编译时,用*代替名称,将所选目录下所有后缀名为pat的文件编译为一个后缀名为SIG文件。

[Signame]:编译后生成的SIG文件的名称。

在SIG文件的制作过程中,如果LIB文件中包含过多的OBJ文件,如何快速地将所有OBJ文件提取出来并生成SIG文件呢?读者可根据SIG文件的制作流程,编写程序将OBJ文件从LIB中逐个提取出来,并生成对应的PAT文件,再将所有PAT文件编译为SIG文件;也可编写批处理文件来快速生成SIG文件。将生成后的SIG文件放置在IDA的安装目录SIG文件夹下。使用快捷键Shift+F5添加SIG文件到分析工程中,如图1-11所示。

 

图1-11显示了当前分析工程中使用到的SIG文件。使用Insert键可加载SIG文件用于此工程;也可在视图中右击,选择Applynewsignature添加SIG文件。

我们还可以编写SIG测试程序,通过制作SGI文件解析出程序中使用的函数,见代码清单1-1。
void ShowSig()
{
     printf("ShowSig");
}
     int main(int argc, char* argv[])
{
     ShowSig(); // 通过制作SIG 文件,在IDA 中解析此函数名称
     return 0;
}

将代码清单1-2中的代码生成的OBJ文件,按照流程制作成SIG文件放置在IDA安装目录下的SIG文件夹下。使用快捷键Shift+F5加载对应SIG文件到分析工程中,如图1-12所示。

 

通过图1-12可知,IDA已经成功解析出函数sub_401000的对应名称为ShowSig,并同时将参数解析了出来。有了SIG文件的帮助,分析工作将更为简单。SIG文件制作批处理文件的过程如代码清单1-2所示。

代码清单1-2 SIG文件制作批处理文件的过程
void ShowSig()
{
     printf("ShowSig");
}
     int main(int argc, char* argv[])
{
     ShowSig(); // 通过制作SIG 文件,在IDA 中解析此函数名称
     return 0;
}

代码清单1-2说明如下几点问题:

通过md%1_objs创建目录,目录名称为参数1

通过cd%1_objs进入刚刚创建的目录中

在当前目录下循环取出LIB中的OBJ名称,并逐个生成对应的OBJ

循环将生成的OBJ文件通过PCF转换成对应的PAT文件

将目录下所有的PAT文件生成为一个SIG文件

将生成的SIG文件拷贝到上级目录中

返回上级目录,删除创建目录中的所有数据

将创建目录删除

将代码清单1-2保存为“lib2sig.bat”,放置在lib同一目录下,在控制台下使用此批处理,生成的SIG文件和LIB文件保存在同一目录下。
“lib2sig.bat”的使用方法:
lib2sig[lib名称][生成SIG文件名称]

设置环境变量时,需要获取pcf.exe、sigmake.exe和link.exe的所在路径,即依次选择“我的电脑”→“属性”→“高级”→“环境变量”→“新建系统变量”→变量名“path”→“变量值”。

在使用这些指令的过程中,如果出现“不是内部或外部命令,也不是可运行的程序”的字样,请查看环境变量是否设置正确。每次修改pcf.exe、sigmake.exe和link.exe的路径时,都需要重新设置环境变量,否则只能在对应目录中使用它们。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.1 调试工具Microsoft Visual C++6.0和OllyDBG
下一篇:1.3 反汇编引擎的工作原理
相关文章
图文推荐
2.3 forward和完美转
2.2 move语义
1.1.2 decltype关键
深入应用C++11:代码
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站