- 献词
- 致谢
- 前言
- 第一部分 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 交叉引用
2.1 分类工具
通常,在初次遇到一个不熟悉的文件时,有必要问自己一些简单的问题,如“这是个什么文件”,回答这个问题的首要原则是,绝不要根据文件的扩展名来确定文件的类型。这是最基本的原则。在脑子里建立起“文件扩展名并无实际意义”的印象后,你就会开始考虑学习下面几个实用工具。
2.1.1 file
file
命令是一个标准的实用工具,大多数*NIX 风格的操作系统和 Windows 下的 Cygwin1 或 MinGw2 工具都带有这个实用工具。 file
图通过检查文件中的某些特定字段来确认文件的类型。有时, file
能够识别常见的字符串,如 #!/bin/sh
(shell 脚本文件)或 <html>
(HTML 文档)。但是,识别那些包含非 ASCII 内容的文件要困难得多,在这种情况下, file
会设法判断该文件的结构是否符合某种已知的文件格式。多数情况下,它会搜索某些文件类型所特有的标签值(通常称为幻数3 )。下面的十六进制表列出了几个用于判断常见文件类型的幻数。
1. 参见 http://www.cygwin.com/ 。
2. 参见 http://www.mingw.org/ 。
3. 幻数 是一些文件格式规范所要求的特殊标签值,它表示文件符合这种规范。有时候,人们在选择幻数时加入了幽默的因素。例如,MS-DOS 的可执行文件头中的 MZ
标签是 MS-DOS 原架构师 Mark Zbikowski 姓名的首字母缩写。众所周知,Java 的.class 文件的幻数为十六进制数 0xcafebabe
,选择它作为幻数,仅仅是因为它是一个容易记忆的十六进制数字符串。
Windows PE executable file 00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ .............. 00000010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ........@....... Jpeg image file 00000000 FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60 ...... JFIF .....` 00000010 00 60 00 00 FF DB 00 43 00 0A 07 07 08 07 06 0A .`.....C........ Java .class file 00000000 CA FE BA BE 00 00 00 32 00 98 0A 00 2E 00 3E 08 .......2......>. 00000010 00 3F 09 00 40 00 41 08 00 42 0A 00 43 00 44 0A .?..@.A..B..C.D.
file
能够识别大量的文件格式,包括数种 ASCII 文本文件、各种可执行文件和数据文件。 file
执行的幻数检查由幻数文件(magic file )所包含的规则控制。幻数文件的默认位置因操作系统而异,常见的位置包括/usr/share/file/magic、/usr/share/misc/magic 和/etc/magic。欲了解更多有关幻数文件的信息,请参阅 file
的文档资料。
Cygwin 环境
Cygwin 是 Windows 操作系统中的一组实用工具,可提供 Linux 风格的命令 shell 和相关程序。在安装过程中,有大量安装包可供用户选择,包括编译器(如 gcc、g++ )、解释器(如 Perl 、Python 、Ruby)、网络实用工具(如 nc 、ssh)等。安装好 Cygwin 后,许多为 Linux 编写的程序就可以在 Windows 系统中编译和执行了。
在某些情况下, file
还能够辨别某一指定文件类型中的细微变化。以下代码证实了 file
不仅能够识别几种不同的 ELF 二进制文件,而且还提供了有关二进制文件如何链接(静态或动态)以及是否去除了符号等信息。
idabook# file ch2_ex_ ch2_ex.exe: MS-DOS executable PE for MS Windows (console) Intel 80386 32-bit ch2_ex_upx.exe: MS-DOS executable PE for MS Windows (console) Intel 80386 32-bit, UPX compressed ch2_ex_freebsd: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 5.4, dynamically linked (uses shared libs), FreeBSD-style, not stripped ch2_ex_freebsd_static: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 5.4, statically linked, FreeBSD-style, not stripped ch2_ex_freebsd_static_strip: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 5.4, statically linked, FreeBSD-style, stripped ch2_ex_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), not stripped ch2_ex_linux_static: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, statically linked, not stripped ch2_ex_linux_static_strip: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, statically linked, stripped ch2_ex_linux_stripped: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped
去除二进制可执行文件的符号
“去除二进制文件的符号”是指从二进制文件中删除符号。编译过程会在二进制目标文件中留下符号。在创建最终的可执行文件或二进制文件时,其中一些符号用于在链接过程中解析文件之间的引用关系。其他情况下,符号用于提供与所使用的调试器有关的其他信息。链接过程完成后,许多符号就没用了。在构建时,传递给链接器的选项可帮助链接器删除不必要的符号。此外,一个名为
strip
的实用工具也可用于删除现有二进制文件中的符号。虽然去除符号后的二进制文件比未去除符号的二进制文件要小,但去除符号后的二进制文件的功能依然保持不变。
file
及类似的实用工具同样也会出错。如果一个文件碰巧包含了某种文件格式的标记, file
等工具很可能会错误地识别这个文件。你可以使用一个十六进制文件编辑器将任何文件的前 4 字节修改为 Java 的幻数序列 CA
FE
BA
BE
,自己证实一下上述情况。这时, file
会将这个新修改的文件错误地识别为 已编译的 Java 类数据 。同样,一个仅包含 MZ
这两个字符的文本文件会被误认为是一个 MS-DOS 可执行文件。在逆向工程过程中,绝不要完全相信任何工具所提供的结果,除非该结果得到其他几款工具和手动分析的确认,这是一个良好的习惯。
2.1.2 PE Tools
PE Tools4 是一组用于分析 Windows 系统中正在运行的进程和可执行文件的工具。PE Tools 的主界面如图 2-1 所示,其中列出了所有活动进程,你可以通过该界面访问 PE Tools 的所有实用工具。
4. 参见 http://petools.org.ru/petools.shtml 。
图 2-1 PE Tools 实用工具
在进程列表中,用户可以将一个进程的内存映像转储到某个文件中,也可以使用 PE Sniffer 实用工具确定可执行文件由何种编译器构建,或者该文件是否经过某种已知的模糊实用工具的模糊处理。Tools 菜单提供了分析磁盘文件的类似选项。另外,用户还可以使用内嵌的 PE Editor 实用工具查看 PE 文件头字段,使用该工具还可以方便地修改任何文件头的值。通常,如果想要从一个文件的模糊版本重建一个有效的 PE,就需要修改 PE 文件头。
二进制文件模糊技术
模糊(obfuscation )指任何掩盖真实意图的行为。应用于可执行文件时,模糊则是指任何掩盖程序真实行为的行为。出于各种原因,程序员可能会采用模糊技术,如保护专有算法及掩盖恶意意图。几乎所有的恶意软件都采用了某种模糊技术,以防止人们对其进行分析。有大量模糊工具可供程序员使用,帮助他们创建模糊程序。我们将在第 21 章详细讨论模糊工具与技术,以及它们对逆向工程的影响。
2.1.3 PEiD
PEiD5 是另一款 Windows 工具,它主要用于识别构建某一特定 Windows PE 二进制文件所使用的编译器,并确定任何用于模糊 Windows PE 二进制文件的工具。图 2-2 显示了如何使用 PEiD 确定模糊 Gaobot6 蠕虫的一个变种所使用的工具(此例中为 ASPack)。
5. 参见 http://peid.info /。
6. 参见 http://securityresponse.symantec.com/security_response/writeup.jsp?docid=2003-112112-1102-99 。
图 2-2 PEiD 实用工具
PEiD 的许多其他功能与 PE Tools 的功能相同,包括显示 PE 文件头信息摘要、收集有关正在运行的进程的信息、执行基本的反汇编等。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论