前言

撰写一本关于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的最新链接)。

目录

  • 版权声明
  • 献词
  • 对上一版的赞誉
  • 致谢
  • 前言
  • 第一部分 IDA简介
  • 第1章 反汇编简介
  • 第2章 逆向与反汇编工具
  • 第3章 IDA Pro 背景知识
  • 第二部分 IDA基本用法
  • 第4章 IDA入门
  • 第5章 IDA 数据显示窗口
  • 第6章 反汇编导航
  • 第7章 反汇编操作
  • 第8章 数据类型与数据结构
  • 第9章 交叉引用与绘图功能
  • 第10章 IDA的多种面孔
  • 第三部分 IDA高级应用
  • 第11章 定制IDA
  • 第12章 使用FLIRT 签名来识别库
  • 第13章 扩展IDA 的知识
  • 第14章 修补二进制文件及其他IDA 限制
  • 第四部分 扩展IDA的功能
  • 第15章 编写IDA 脚本
  • 第16章 IDA 软件开发工具包
  • 第17章 IDA 插件体系结构
  • 第18章 二进制文件与 IDA 加载器模块
  • 第19章 IDA 处理器模块
  • 第五部分 实际应用
  • 第20章 编译器变体
  • 第21章 模糊代码分析
  • 第22章 漏洞分析
  • 第23章 实用IDA 插件
  • 第六部分 IDA调试器
  • 第24章 IDA 调试器
  • 第25章 反汇编器/ 调试器集成
  • 第26章 其他调试功能
  • 附录A 使用IDA 免费版本5.0
  • 附录B IDC/SDK交叉引用