1.2 使用pefile解析PE文件格式

由Ero Carerra编写和维护的Python模块pefile已经成为解析PE文件的一个行业标准的恶意软件分析库。在本节中,我将向你展示如何使用pefile来解析ircbot.exe。你可以在本书附带虚拟机中的~/malware_data_science/ch1/data目录中找到ircbot.exe文件。代码清单1-1假设ircbot.exe已位于你当前的工作目录中。

输入以下命令安装pefile库,以便我们可以在Python中导入它:

现在,使用代码清单1-1中的命令启动Python,导入pefile模块,然后使用pefile打开并解析PE文件ircbot.exe。

代码清单1-1 加载pefile模块并解析PE文件(ircbot.exe)

我们实例化pefile.PE,它是PE模块实现的核心类。它解析PE文件,以便我们可以查看它们的属性。通过调用PE构造函数,我们加载并解析指定的PE文件,在本例中为ircbot.exe。现在我们已经加载并解析了这个文件,运行代码清单1-2中的代码从ircbot.exe的pe字段中提取信息。

代码清单1-2 遍历PE文件的各个节并打印有关它们的信息

代码清单1-3显示了打印输出的内容。

代码清单1-3 使用Python的pefile模块从ircbot.exe中提取节数据

如代码清单1-3所示,我们从PE文件五个不同的节中提取了数据:.text、.rdata、.data、.idata和.reloc。输出是以五元组的形式给出,每提取一个PE节对应一个元素。每一行的第一个条目标识PE节。(你可以忽略一系列的\x00空字节,它们只是C语言样式的空字符串终止符。)其余字段告诉我们,一旦将每个节被加载到内存中,它的内存利用率将是多少,以及一旦被加载,它将在内存中的何处被找到。

例如,0x1000❶是加载这些节的虚拟内存地址基址,也可以将其视为节的内存地址基址。在虚拟大小(virtual size)字段中的0x32830 ❷指定了节被加载后所需的内存大小。第三个字段中的207360 ❸表示该节将在该内存块中所占用的数据量。

除了使用pefile解析程序的节之外,我们还可以使用它列出二进制文件将加载的DLL文件,以及它将在这些DLL文件中所请求的函数调用。我们可以通过镜像(dump)PE文件的IAT来实现这一点。代码清单1-4显示了如何使用pefile镜像ircbot.exe的IAT。

代码清单1-4 从ircbot.exe中提取导入信息

代码清单1-4会生成如代码清单1-5所示的输出(为了简洁起见,输出进行了截断)。

代码清单1-5 ircbot.exe的IAT表内容,其显示了这个恶意软件使用的库函数

如代码清单1-5所示,这个输出对于恶意软件分析很有价值,因为它列出了恶意软件声明和将引用的丰富的函数数组。例如,输出的前几行告诉我们,恶意软件将使用WriteFile❶写入文件,使用CreateFileA ❷打开文件,并使用CreateProcessA ❸创建新的进程。虽然这些只是关于恶意软件的基本信息,但它们是了解恶意软件更为详细行为的开始。