返回介绍

2.1 分类工具

发布于 2024-10-11 21:05:40 字数 6687 浏览 0 评论 0 收藏 0

通常,在初次遇到一个不熟悉的文件时,有必要问自己一些简单的问题,如“这是个什么文件”,回答这个问题的首要原则是,绝不要根据文件的扩展名来确定文件的类型。这是最基本的原则。在脑子里建立起“文件扩展名并无实际意义”的印象后,你就会开始考虑学习下面几个实用工具。

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

enter image description here

图 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

enter image description here

图 2-2 PEiD 实用工具

PEiD 的许多其他功能与 PE Tools 的功能相同,包括显示 PE 文件头信息摘要、收集有关正在运行的进程的信息、执行基本的反汇编等。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文