在本章中,我们将介绍静态恶意软件分析的基础知识。静态分析通过分析程序执行文件反汇编代码、图形图像、可打印字符串,和其他磁盘资源。它指的是不实际运行程序的逆向工程。虽然静态分析技术有其缺点,但它们可以帮助我们了解各种各样的恶意软件。通过仔细的逆向工程,您将能够更好地理解恶意程序二进制文件在攻击者占领目标后所带来的好处,以及攻击者可以隐藏并继续攻击受感染的机器的方法。您将看到,本章结合了描述和示例。每个部分介绍了一种静态分析技术,然后说明了它在实际分析中的应用。
在本章的开始,我将描述大多数Windows程序使用的可移植可执行文件格式,然后研究如何使用流行的Python库pefile来剖析实际的恶意软件二进制文件。然后描述import分析、图形图像分析和字符串分析等技术。在所有情况下,我将向您展示如何使用开放源码工具将分析技术应用于实际恶意软件。最后,在本章的最后,我将介绍恶意软件给恶意软件分析人员带来的困难,并讨论一些减轻这些问题的方法。
您将在本书目录/ch1下的数据中找到本章示例中使用的恶意软件示例。为了演示本章讨论的技术,我们使用ircbot.exe,一个为实验使用而创建的互联网中继聊天(IRC)机器人,作为在野外常见的恶意软件的一个例子。因此,当连接到IRC服务器时,程序被设计成驻留在目标计算机上。ircbot.exe抓住一个目标后,攻击者可以通过IRC控制目标计算机,允许他们采取行动,如打开网络摄像头捕获和偷偷地提取目标的物理位置的视频,把桌面的截图,从目标机器中提取文件,等等。在本章中,我将演示静态分析技术如何揭示这种恶意软件的功能。
一、Microsoft Windows可移植可执行格式
要执行静态恶意软件分析,您需要了解Windows PE格式,它描述了现代Windows程序文件的结构,如.exe、.dll和.sys文件,并定义了它们存储数据的方式。PE文件包含x86指令、图像和文本等数据,以及程序运行所需的元数据。
PE格式最初的设计目的如下:
告诉Windows如何将程序加载到内存中PE格式描述了文件的哪些块应该加载到内存中,以及在哪里加载。它还告诉您在Microsoft Windows Portable可执行文件格式中执行静态恶意软件分析时,需要了解Windows PE格式,该格式描述了现代Windows程序文件的结构,如.exe、.dll和.sys文件,并定义了它们存储数据的方式。PE文件包含x86指令、图像和文本等数据,以及程序运行所需的元数据。
PE格式最初的设计目的如下:
告诉Windows如何将程序加载到内存中PE格式描述了文件的哪些块应该加载到内存中,以及在哪里加载。它还告诉您在程序代码窗口的什么位置应该启动程序的执行,以及应该将哪些动态链接的代码库加载到内存中。
提供正在运行的程序在执行过程中可能使用的媒体(或资源)。这些资源可以包括字符串,如GUI对话框或控制台输出中的字符,以及图像或视频。
提供安全数据(如数字代码签名)Windows使用此类安全数据来确保代码来自可信源。
PE格式利用图1-1中所示的一系列构造完成了所有这些。
如图所示,PE格式包含一系列头文件,这些头文件告诉操作系统如何将程序加载到内存中。它还包括一系列包含实际程序数据的部分。Windows将这些部分加载到内存中,使它们的内存偏移量与它们在磁盘上出现的位置相对应。让我们从PE头开始更详细地研究这个文件结构。我们将跳过对DOS头的讨论,它是上世纪80年代微软DOS操作系统的遗留物,只是出于兼容性的原因才出现。
1.1PE头
显示在图1 - 1的底部,在DOS头➊PE头➋,它定义了程序的一般属性,如二进制代码,图片,压缩数据,和其他程序属性。它还告诉我们程序是为32位系统设计的还是为64位系统设计的。PE头为恶意软件分析人员提供了基本但有用的上下文信息。例如,头文件包含一个时间戳字段,可以泄露恶意软件作者编译文件的时间。当恶意软件作者忘记用伪值替换该字段时,就会发生这种情况,而他们经常这样做。
1.2可选的头
可选头➌实际上是无处不在的在今天的PE可执行程序,相反其名。它定义了PE文件中程序入口点的位置,PE文件引用了程序加载后运行的第一条指令。它还定义了Windows在加载PE文件、Windows子系统、程序目标(如Windows GUI或Windows命令行)和有关程序的其他高级细节时加载到内存中的数据的大小。这个头文件中的信息对逆向工程师来说是无价的,因为程序的入口点告诉他们从哪里开始逆向工程。
1.3节标头
节标题➍描述PE文件中包含的数据段。PE文件中的一个部分是一组数据,当操作系统加载一个程序时,这些数据将被映射到内存中,或者包含有关如何将程序加载到内存中的指令。换句话说,节是磁盘上的字节序列,它要么成为内存中连续的字节字符串,要么通知操作系统加载过程的某个方面。
节标头还告诉Windows应该授予节哪些权限,比如程序在执行时是否应该可读、可写或可执行。例如,包含x86代码的.text部分通常被标记为可读和可执行的,但不可写,以防止程序代码在执行过程中意外修改自身。
图1-1描述了一些部分,如.text和.rsrc。当执行PE文件时,这些将被映射到内存中。其他特殊部分,如.reloc部分,没有映射到内存中。我们也将讨论这些部分。让我们回顾一下图1-1所示的部分。
(1).text部分
每个PE程序的节标头中至少包含一个x86代码段,该代码段标为可执行;这些部分几乎总是.text➎命名。在第2章执行程序反汇编和逆向工程时,我们将在.text小节中分解数据。
(2).idata部分
➏.idata部分,也称为进口,包含导入地址表(IAT),列出了动态链接库及其功能。IAT是最重要的PE结构之一,当最初接近PE二进制文件进行分析时,需要检查它,因为它揭示了程序所进行的库调用,而这些调用反过来又可能泄露恶意软件的高级功能。
(3)data部分
PE文件中的数据部分可以包括.rsrc、.data和.rdata等部分,它们存储程序使用的鼠标光标图像、按钮皮肤、音频和其他媒体等项。例如,.rsrc部分➐在图1 - 1包含可打印字符串,一个程序使用呈现文本字符串。
rsrc (resources)部分中的信息对恶意软件分析人员非常重要,因为通过检查PE文件中的可打印字符串、图形图像和其他资产,他们可以获得关于文件功能的重要线索。第7页“检查恶意图片”,您将学习如何使用icoutils工具包(包括icotool和wrestool)从恶意二进制文件的资源部分提取图形图片。然后,在第8页的“检查恶意软件字符串”中,您将学习如何从恶意软件资源部分提取可打印的字符串。
(4).reloc部分
PE二进制文件的代码不是位置独立的,这意味着如果它从预期的内存位置移动到新的内存位置,它将不能正确执行。.reloc部分➑被允许在这个代码不打破。它告诉Windows操作系统,如果已经移动了PE文件的代码,则转换PE文件中的内存地址,以便代码仍然正确运行。这些转换通常涉及从内存地址中添加或减去偏移量。
虽然PE文件的。reloc部分可能包含了你想要在恶意软件分析中使用的信息,但在本书中我们不会进一步讨论它,因为我们的重点是将机器学习和数据分析应用到恶意软件上,而不是做那种需要寻找重定位的核心逆向工程。
二、使用pefile剖析PE格式
由Ero Carerra编写和维护的pefile Python模块已经成为剖析PE文件的行业标准恶意软件分析库。在本节中,我将向您展示如何使用pefile来剖析ircbot.exe。在目录中可以找到本书附带的虚拟机上的ircbot.exe文件。
~/malware_data_science/ch1/data.
清单1-1假设ircbot.exe位于当前工作目录中。
输入以下命令安装pefile库,以便我们可以在Python中导入它:
$ pip install pefile
现在,使用清单1-1中的命令启动Python,导入pefile模块,然后使用pefile打开并解析PE文件ircbot.exe。
$ python
>>> import pefile
>>> pe = pefile.PE("ircbot.exe")
清单1-1:加载pefile模块并解析PE文件(ircbot.exe)
我们实例化pefile。是PE模块实现的核心类。它解析PE文件,以便我们可以检查它们的属性。通过调用PE构造函数,我们加载并解析指定的PE文件,在本例中是ircbot.exe。现在已经加载并解析了文件,运行清单1-2中的代码从ircbot.exe的PE字段中提取信息。
# based on Ero Carrera's example code (pefile library author)
for section in pe.sections:
print (section.Name, hex(section.VirtualAddress),
hex(section.Misc_VirtualSize), section.SizeOfRawData )
清单1-2:遍历PE文件的各个部分并打印有关它们的信息
清单1-3显示了输出。
('.text\x00\x00\x00', ➊'0x1000', ➋'0x32830', ➌207360)
('.rdata\x00\x00', '0x34000', '0x427a', 17408)
('.data\x00\x00\x00', '0x39000', '0x5cff8', 10752)
('.idata\x00\x00', '0x96000', '0xbb0', 3072)
('.reloc\x00\x00', '0x97000', '0x211d', 8704)
清单1-3:使用Python的pefile模块从ircbot.exe中提取节数据
如清单1-3所示,我们从PE文件的五个不同部分提取了数据:.text、.rdata、.data、.idata和.reloc。输出以五个元组的形式给出,每个PE段对应一个元组。每一行的第一个条目标识PE部分。(您可以忽略\x00空字节序列,它们只是c样式的空字符串终止符。)其余字段告诉我们,一旦将每个部分加载到内存中,它的内存利用率将是多少,以及一旦加载,它将在内存中的何处被找到。
例如,0 x1000➊是虚拟内存地址,这些部分将被加载。可以将其视为节的基本内存地址。0 x32830➋在虚拟字段指定大小的内存数量一旦加载所需的部分。207360年第三个字段➌代表了部分的数据量将占用的内存块中。
除了使用pefile解析程序的节之外,我们还可以使用它列出二进制文件将加载的dll,以及它将在这些dll中请求的函数调用。我们可以通过转储PE文件的IAT来实现这一点。清单1-4显示了如何使用pefile转储ircbot.exe的IAT。
$ python
pe = pefile.PE("ircbot.exe")
for entry in pe.DIRECTORY_ENTRY_IMPORT:
print entry.dll
for function in entry.imports:
print '\t',function.name
清单1-4:从ircbot.exe中提取导入
清单1-4应该产生如清单1-5所示的输出(为简洁起见,进行了截断)。
KERNEL32.DLL
GetLocalTime
ExitThread
CloseHandle
➊ WriteFile
➋ CreateFileA
ExitProcess
➌ CreateProcessA
GetTickCount
GetModuleFileNameA
清单1-5:ircbot的IAT内容。显示该恶意软件使用的库函数
如清单1-5所示,这个输出对于恶意软件分析很有价值,因为它列出了恶意软件声明和引用的丰富函数数组。例如,输出的前几行告诉我们,恶意软件将使用WriteFile➊写入文件,使用CreateFileA叫➋打开的文件,并创建新的进程使用CreateProcessA➌。虽然这是关于恶意软件的基本信息,但这是更详细了解恶意软件行为的开始。
三、检查恶意软件的图片
要了解恶意软件是如何设计来攻击目标的,让我们看看它的.rsrc部分中包含的图标。例如,恶意软件二进制文件常常被设计成通过伪装成Word文档、游戏安装程序、PDF文件等欺骗用户点击它们。您还可以在恶意软件中找到一些图像,提示攻击者自己感兴趣的程序,比如网络攻击工具和攻击者运行的用于远程控制受攻击机器的程序。我甚至看到过包含圣战分子桌面图标的二进制文件、看起来邪恶的赛博朋克卡通人物的图像,以及卡拉什尼科夫步枪的图像。对于我们的样本图像分析,让我们考虑一个恶意软件样本,安全公司曼迪昂特(Mandiant)被认定是由一个中国政府支持的黑客组织设计的。您可以在本章的数据目录中找到这个示例恶意软件,名为fakepdfmalware.exe。本示例使用网络攻击工具和攻击者运行的程序来远程控制受攻击的机器。我甚至看到过包含圣战分子桌面图标的二进制文件、看起来邪恶的赛博朋克卡通人物的图像,以及卡拉什尼科夫步枪的图像。对于我们的样本图像分析,让我们考虑一个恶意软件样本,安全公司曼迪昂特(Mandiant)被认定是由一个中国政府支持的黑客组织设计的。您可以在本章的数据目录中找到这个示例恶意软件,名为fakepdfmalware.exe。本示例使用adobeacrobat图标欺骗用户,让他们以为它是adobeacrobat文档,而实际上它是一个恶意的PE可执行文件。
在使用Linux命令行工具wrool从fakepdfmalware.exe二进制文件中提取图像之前,首先需要创建一个目录来保存将要提取的图像。清单1-6显示了如何完成这些操作。
$ mkdir images
$ wrestool –x fakepdfmalware.exe –output=images
$ icotool –x –o images images/*.ico
清单1-6:从恶意软件样本中提取图像的Shell命令
我们首先使用mkdir映像创建一个目录来保存提取的映像。接下来,我们使用wrestool提取图像资源(- x)从fakepdfmalware-exe到 /image,然后使用icotool提取(- x)和转换(o) Adobe ico图标格式中的任何资源到png图形以便我们使用标准的图像查看器工具可以查看它们。您的系统上没有安装wrestool,您可以在http://www.nongnu.org/icoutils/上下载。
您已经使用wrestool将目标可执行文件中的图像转换为PNG格式,您应该可以在您喜欢的图像查看器中打开它们,并在各种分辨率下看到adobeacrobat图标。正如我在这里的示例所演示的,从PE文件中提取图像和图标相对简单,并且可以快速显示有关恶意软件二进制文件的有趣和有用信息。类似地,我们可以很容易地从恶意软件中提取可打印字符串以获取更多信息,我们接下来将这样做。
四、检查恶意软件的字符串
字符串是程序二进制中可打印字符的序列。恶意软件分析人员通常依赖恶意样本中的字符串来快速了解其中可能发生的情况。这些字符串通常包含HTTP和FTP命令,这些命令下载web页面和文件,IP地址和主机名告诉您恶意软件连接到什么地址,等等。有时,即使是用来编写字符串的语言也能提示恶意软件二进制文件的来源,尽管这可能是伪造的。您甚至可能发现字符串中的文本解释了恶意二进制文件的目的。
字符串还可以显示有关二进制文件的更多技术信息。例如,您可能会发现有关用于创建二进制文件的编译器、二进制文件使用的编程语言、嵌入式脚本或HTML等信息。尽管恶意软件作者可以混淆、加密和压缩所有这些跟踪,但即使是高级恶意软件作者也常常会留下至少一些暴露的跟踪,这使得在分析恶意软件时检查字符串转储尤为重要。
五、使用字符串程序
查看文件中所有字符串的标准方法是使用命令行工具字符串,它使用以下语法:
$ strings filepath | less
该命令将文件中的所有字符串逐行打印到终端。最后添加|少阻止字符串只是滚动整个终端。默认情况下,strings命令查找所有最小长度为4字节的可打印字符串,但是您可以设置不同的最小长度并更改各种其他参数,如commands manual页面中列出的那样。我建议只使用默认的最小字符串长度4,但是您可以使用-n选项更改最小字符串长度。例如,string -n 10 filepath只提取长度最小为10字节的字符串。
(1)分析字符串输出
现在我们输出了一个恶意软件程序的可打印字符串,挑战是要理解这些字符串的含义。例如,假设我们将字符串输出到ircbotstring.txt文件中,该文件用于ircbot.exe,我们在本章前面使用pefile库对其进行了研究,如下所示:
$ strings ircbot.exe > ircbotstring.txt
txt的内容包含数千行文本,但其中一些行应该突出显示出来。例如,清单1-7显示了从字符串输出中提取的一串以单词DOWNLOAD开头的行。
[DOWNLOAD]: Bad URL, or DNS Error: %s.
[DOWNLOAD]: Update failed: Error executing file: %s.
[DOWNLOAD]: Downloaded %.1fKB to %s @ %.1fKB/sec. Updating.
[DOWNLOAD]: Opened: %s.
--snip--
[DOWNLOAD]: Downloaded %.1f KB to %s @ %.1f KB/sec.
[DOWNLOAD]: CRC Failed (%d != %d).
[DOWNLOAD]: Filesize is incorrect: (%d != %d).
[DOWNLOAD]: Update: %s (%dKB transferred).
[DOWNLOAD]: File download: %s (%dKB transferred).
[DOWNLOAD]: Couldn't open file: %s
清单1-7:显示恶意软件可以将攻击者指定的文件下载到目标计算机的字符串输出
这些行表示ircbot.exe将尝试将攻击者指定的文件下载到目标计算机上。
我们来分析另一个。清单1-8所示的字符串转储表明ircbot.exe可以充当web服务器,侦听目标机器上来自攻击者的连接。
➊ GET
➋ HTTP/1.0 200 OK
Server: myBot
Cache-Control: no-cache,no-store,max-age=0
pragma: no-cache
Content-Type: %s
Content-Length: %i
Accept-Ranges: bytes
Date: %s %s GMT
Last-Modified: %s %s GMT
Expires: %s %s GMT
Connection: close
HTTP/1.0 200 OK
➌ Server: myBot
Cache-Control: no-cache,no-store,max-age=0
pragma: no-cache
Content-Type: %s
Accept-Ranges: bytes
Date: %s %s GMT
Last-Modified: %s %s GMT
Expires: %s %s GMT
Connection: close
HH:mm:ss
ddd, dd MMM yyyy
application/octet-stream
text/html
清单1-8:字符串输出,显示恶意软件有一个HTTP服务器,攻击者可以连接到该服务器
清单1-8显示了ircbot.exe用于实现HTTP服务器的各种HTTP样板文件。很可能这个HTTP服务器允许攻击者通过HTTP连接到目标机器,从而发出命令,例如获取受害者桌面的屏幕快照并将其发送回攻击者。我们在清单中看到了HTTP功能的证据。例如,GET方法➊请求数据从一个网络资源。线HTTP / 1.0 200 OK➋是HTTP字符串返回200状态码,表明一切顺利与HTTP网络交易,和服务器:myBot➌表明myBot HTTP服务器的名称,ircbot.exe有一个内置的HTTP服务器。
所有这些信息都有助于理解和阻止特定的恶意软件样本或恶意活动。例如,知道恶意软件样本有一个HTTP服务器,当您连接到它时,它会输出特定的字符串,这样您就可以扫描您的网络来识别受感染的主机。
总结
在本章中,您大致了解了静态恶意软件分析,其中包括在不实际运行的情况下检查恶意软件程序。您了解了定义Windows .exe和.dll文件的PE文件格式,还了解了如何使用Python库pefile剖析实际的恶意软件ircbot.exe二进制文件。您还使用静态分析技术(如图像分析和字符串分析)从恶意软件样本中提取更多信息。第2章继续讨论静态恶意软件分析,重点分析可以从恶意软件中恢复的汇编代码。