0. 内容概述
通过反病毒引擎扫描可疑软件、通过哈希值查询可疑软件、通过字符串查询分析可疑软件、加壳可疑软件分析、PE格式可疑软件分析、可疑软件链接库与函数分析。
1. 反病毒引擎扫描:实用的第一步
在分析一个可以的恶意软件样本时,第一步就是拿多个反病毒软件扫描这个文件,看是否有哪个引擎已经能够识别它。因为不同的反病毒软件使用了不同的特征库和启发式检测方法。所以对同一个恶意代码样本,运行多个不同的反病毒软件进行扫描检测是相当必要的。类似VirusTotal这样的网站允许你上传一个文件,然后调用多个反病毒引擎来进行扫描。VirusTotal网站会生成一份报告,其中提供了所有引擎对这个样本的识别情况、表示这个样本是否恶意、恶意代码名称、以及其他额外信息,如图1所示。
图1. 通过VirusTotal检查可疑软件
2. 哈希值:恶意代码的指纹
哈希是一种用来唯一表示恶意代码的方法。恶意代码通过一个哈希程序,会产生出一段用于唯一标识这个样本的独特哈希值(类似于一种指纹)。常见的哈希值包括,MD5、SHA-1、SHA-256。通过将可疑文件提交到VirusTotal,可以实现可以文件哈希值的生成(DETAILS表格),如图2所示。
图2. 通过VirusTotal生成可疑文件的哈希值
3. 查找字符串
程序中的字符串就是一串可打印的字符序列,比如“abcdefg”。一个程序会包含一些字符串,比如打印出的消息、连接的URL,或是复制文件到某个特定位置。从字符串中进行搜索是获得程序功能提示的一种简单方法。可以通过IDA Pro的字符串搜索功能(Shift+F12)获取可疑文件的字符串,如图3所示。通过观察字符串,可初步判断可疑文件可能为使用非对称加密的勒索软件。
图3. 通过IDA Pro获取可疑文件字符串
需要注意,字符串通常是以ASCII或Unicode格式进行存储,这两种格式在存储字符串序列时都以NULL结束符表示字符串已经终结。ASCII字符串每个字符使用1个字节,Unicode字符串每个字符使用2个字节。
4. 加壳与混淆恶意代码
恶意代码编写者经常使用加壳或混淆技术,让它们的文件更难被检测或分析。混淆程序是恶意代码编写者尝试去隐藏其执行过程的代码。而加壳程序则是混淆程序中的一类,加壳后的恶意程序会被压缩,并且难以分析。合法程序大多总是会包含很多字符串。而由被加壳或被混淆的恶意代码直接分析获取得到的可打印字符串则很少,如图4所示。
图4. 通过UPX加壳后可疑文件字符串
检测加壳软件的一种方法是使用PEiD工具。可疑使用PEiD来检测加壳器的类型,或是用来连接应用程序的编译器类型,这使得分析加壳软件变得更加容易一些,如图5所示。
图5. 通过PEiD检测加壳可疑文件
5. PE文件格式
可移植执行(PE)文件是Windows可执行文件、对象代码和DLL所使用的标准格式。PE文件格式起始是一种数据结构,包含为Windows操作系统加载器管理可执行代码所必须的信息。几乎每个在Windows系统中加载的可执行代码都使用PE文件格式。
PE文件以一个文件头开始,其中包括代码信息、应用程序类型、所需的库函数与空间要求。PE头中的信息对于恶意代码分析师而言非常有价值。PE文件头之后是文件的一些实际部分,每个分解中都包含了有用的信息。
图6. Windows平台可执行PE文件的分节
5.1 使用PEview分析PE文件
使用PEview工具浏览PE文件头部信息,IMAGE_DOS_HEADER和MS-DOS存根程序,是历史遗留问题,没有任何值得关注的信息。IMAGE_NT_HEADER,显示了NT文件头。特征签名始终是相同的,可以直接忽略。IMAGE_FILE_HEADER包含了文件的基本信息,如Machine、Number of Section等信息(有一些信息无法被读出),如图7所示。IMAGE_OPTIONAL_HEADER包含了几个重要信息,其中子系统描述会指出该文件对应控制台程序还是图形界面程序。
图7. 通过PEview分析PE文件IMAGE_NT_HEADER
PE文件头中最有趣的信息来自于分节头部描述信息,存储在IMAGE_SECTION_HEADER中,如图8所示。编译器通常会创建和命名一个可执行文件各个分节,而用户无法控制这些名称。因此,可执行文件在这些分节上的名称通常是一致的,如图6所示。
图8. 通过PEview分析PE文件IMAGE_SECTION_HEADER
在图8中,VIRTUAL SIZE告诉我们可疑文件在加载过程中需要分配多少空间给对应的分节,SIZE OF RAW DATA告诉未能磁盘上对应分节的大小,原则上这两个值应该十分相近,因为数据在内存中需要与磁盘上一样多的空间。
上面提到的分节大小在检测加壳可执行文件时非常有用,如果VIRTUAL SIZE比SIZE OF RAW DATA大得多,则对应节在内存中占用了比磁盘上存储更多的空间。这往往意味着加壳代码的存在,特别是当.text分节在内存中较磁盘上更大一些时。
SECTION | VIRTUAL SIZE | SIZE OF RAW DATA |
.text | 9B63A | 9B800 |
.rdata | 211B8 | 21200 |
.data | 07640 | 05200 |
.rsrc | 001E0 | 00200 |
.reloc | 07A54 | 07C00 |
表1显示了可疑文件中的分节,其中.data分节的VIRTUAL SIZE大于SIZE OF RAW DATA,该分节存在被压缩的可能。
5.2 使用Resource Hacker工具查看.rsrc
完成了对PE文件头部的分析,可疑进一步对PE分节进行分析。其中,最容易分析的就是.rsrc分节,可疑通过Resource Hacker工具对该分节进行分析,如图9所示。
图9. 通过Resource Hacker分析PE文件.rsrc
6. 链接库与函数
对于一个可执行文件,我们可以收集到的最有用的信息之一,就是它的导入表。导入函数是一个程序所使用的,存储在另一个程序中的那些函数,比如对于很多程序都通用的一些代码函数库。
6.1 静态链接、运行时链接、动态链接
静态链接:是Windows平台最不常用的方法,尽管这种方法在UNIX和Linux程序中比较常见。当一个库被静态链接到可执行程序时,所有这个库中的代码都会被复制到可执行程序中,这回让可执行程序显著增大。而在代码分析时,很难区分静态链接的代码与可执行程序自身代码,因为在PE文件头中没有迹象表明这个文件包含有链接代码。
动态链接:是最常见的链接方式,对于恶意代码分析师也是最应该关注的。PE文件头中存储了每个被装载的库文件,以及每个被程序使用的函数信息。程序所使用的库与调用的函数,经常是一个程序中最重要的部分,识别它们尤为重要,因为这些信息允许我们来猜测这个恶意代码样本到底干了些什么事情。
运行时链接:常用于恶意代码中,特别是当恶意代码被加壳或混淆时。使用运行时链接的可执行程序,只有当需要使用函数时,才链接到库,而不是像动态链接模式那样在程序启动时就链接。
6.2 动态链接函数分析
通过Dependency Walker可以实现可疑文件动态链接函数的分析,如图10所示。图左侧显示可疑文件链接的所有DLL库,图右上显示CRYPT32.DLL正在调用的函数,图右下显示CRYPT32.DLL能够调用的所有函数,另外VirusTotal与IDA Pro也均可以实现动态链接函数分析。
图10. 通过Dependency Walker分析动态链接函数