撰写一本关于IDA Pro的书是一个充满挑战的任务。事实上,IDA 是一款非常复杂的软件,它的功能特别强大,要在一本书中详细介绍所有这些功能,几乎是一项无法完成的任务。而且,IDA一直在不断推出新版本,因此,任何介绍IDA 的图书在出版时都会落后一两个版本。在本书第1版即将出版时,IDA 发布了版本5.3,但自本书第1版出版以来,IDA 已发布了7个新版本(包括版本5.3)。IDA 6.0 采用了一个新的、基于Qt1的图形用户界面,这促使我对本书进行更新,以介绍许多第1 版并未介绍的功能。当然,和往常一样,IDA 的另一个版本(6.1)也即将发布,2这确实让人非常兴奋。
1.Qt是诺基亚开发的一个跨平台的C++ 图形用户界面应用程序框架。——译者注
2.2011年4月发布了IDA 6.1,2011 年10月发布了IDA 6.2。——编者注
我撰写这一版的目的是帮助更多用户了解IDA ,并培养他们对逆向工程的兴趣(如果可能)。对于希望进入逆向工程领域的读者,我希望向你们强调掌握熟练的编程技巧的重要性。理想情况下,你们应热爱编程,甚至要时时刻刻都想着编程。如果你对编程感到畏惧,那么逆向工程可能并不适合你。你可能会认为,逆向工程根本不需要编程,因为这只需要分解其他人的程序,但如果无法开发出能帮助你自动完成各种任务的脚本和插件,你永远也不可能成为真正高效的逆向工程人员。对我而言,编程和逆向工程就像是《纽约时报》周日版的纵横字谜游戏,对此我乐在其中。
为保持一致性,这个版本保留了第1 版的总体结构,并且更为详细地阐述了部分章节,同时增加了一些新内容。阅读本书的方式多种多样。对逆向工程知之甚少的用户可以从第1 章和第2章开始,了解有关逆向工程和反汇编器的一些信息;对IDA 了解不多、希望深入学习的读者可以从第3章开始,这一章主要介绍IDA 的基本布局;第4章则描述如何启动IDA 并加载文件进行分析;第5章到第7章介绍IDA 的用户界面窗口和基本功能。
对IDA 有一定了解的读者可以从第8章开始阅读,这一章讨论如何使用IDA 处理复杂的数据结构,包括C++ 类;而第9 章则介绍IDA 交叉引用,它是IDA 基于图形的显示(也在第9 章介绍)的基础;第10 章说明如何在非Windows平台上(Linux或OS X)运行IDA 。
更加高级的IDA 用户可能会发现,第11 章到第14 章是不错的起点,主要介绍IDA 的高级用法及其配套工具。第11 章简要说明IDA 的一些配置选项;第12 章描述IDA 的FLIRT/FLAIR 技术和相关工具,我们利用它们开发签名,并利用这些签名将库代码与应用程序代码区分开来;第13 章讨论IDA 类型库及如何扩展类型库;而第14章则回答一些常见的问题,说明IDA 是否可用于修补二进制文件。
IDA 是一款即装即用的强大工具,可扩展性是它最大的优点之一,这些年来,用户利用这一优点让IDA 完成了一些非常有趣的任务。IDA 的可扩展性在第15 章到第19 章讨论。第15 章介绍IDA的脚本功能(新增了IDAPython ),并系统讨论IDA 的SDK (软件开发工具包)提供的编程API;第16 章全面介绍SDK ;而第17章到第19 章则讨论插件、文件加载器和处理器模块。
介绍完IDA 的全部功能后,第20 章至第23 章转而讨论IDA 在逆向工程方面更加实际的用法,分析各种编译器的区别(第20章),介绍如何使用IDA 分析恶意软件中常见的模糊代码(第21 章),以及如何利用IDA 发现和分析漏洞(第22 章)。第23 章则介绍这些年来发布的一些有用的IDA 扩展(插件)。
最后,第24 章至第26 章介绍IDA 的内置调试器。第24 章首先介绍调试器的基本功能;第25 章讨论使用调试器分析模糊代码遇到的一些挑战,其中包括处理可能出现的反调试功能所带来的挑战;第26 章则讨论IDA 的远程调试功能,以及使用Bochs模拟器作为集成的调试平台,以此结束本书的讨论。
写作本书时,IDA 的最新版本为6.1,本书在很大程度上以IDA 6.1 为介绍对象。Hex-Rays 公司非常慷慨,为用户提供了一个免费版本。IDA 免费版是IDA 5.0的一个删减了部分功能的版本。本书讨论的大部分IDA 功能也适用于免费版本,附录A简要介绍了用户在使用免费版本时可能遇到的一些不同之处。
首先学习IDA 脚本功能,然后逐步学习如何创建编译插件,这似乎是一个自然的发展过程。因此,我们在附录B 中全面介绍了每一个IDC 函数及其对应的SDK 操作。有时候,你可以在IDC函数与SDK 函数之间建立起一一对应的关系(尽管这些函数的名称并不相同);而有时候,实现单独一个IDC 函数可能需要调用几个SDK 函数。附录B回答了这个问题:“我知道如何用IDC 完成某个任务,但是,如何使用插件完成这个任务呢?”附录B中的信息通过逆向工程IDA 内核获得,根据IDA 的非传统许可协议,这样做完全合法。
在整本书中,我都尽量使用较短的代码说明问题。绝大多数的示例代码,以及许多用于生成示例的二进制文件,都可以在本书的官方网站上找到,其地址为http://www.idabook.com/。在那里,你还可以找到本书并未包含的一些示例,以及本书所使用的所有参考文献(如脚注中引用的URL的最新链接)。