Pe文件静态分析

Pe文件静态分析能够获取到哪些信息

在分析一个样本之前,通常会需要静态分析,如何从PE文件格式中获取到需要的信息就很重要。只有在静态分析时对文件的一些布局信息有了理解,例如是是否被加壳了(虽然可以用查壳工具,但是还是需要知道一些原理),文件时图形化界面(GUI)还是命令执行程序(CUI)等信息的提取和掌握,分析时才会更清晰要做什么,做到心中有数。下面是在阅读《恶意软件分析实战》第一章中的一些整理笔记,希望为后续的学习和分析中提供一些基础理论知识来支撑。

程序的基本信息特征

采集程序的md5 sha1 sha-256的信息,之后到virutotal hybird anyrun等在线沙箱去做分析,查看一些分析报告的信息。这里推荐使用hashmyfiles,如下

Pe文件静态分析
使用上述特征到在线分析网站查找即可。如下是virutotal的查找结果
Pe文件静态分析

程序的编译时间

使用PEView查看PEIMAGE_NT_HEADERS-->IMAGE_FILE_HEADER-->Time Date Stamp,如下
Pe文件静态分析
可以知道这程序是2018/01/21 Sun 00:27:26 UTC被编译的,有些时候这个时间也不够准确,不过这个也靠我们自己去判断即可。有时候一个样本的出现时间很早的话,很多查杀软件都有了对应的特征,如果再次出现表明此程序是一个变种样本,值得窥探。

程序的子系统

程序的子系统是在IMAGE_OPTIANL_HEADER下的SubSystem字段中,通常主要分为IMAGE_SUBSYSTEM_WINDOWS_GUIIMAGE_SUBSYSTEM_WINDOWS_CUI两个类型,第一个是图形化程序,第二个是一个命令执行程序,使用PEView查看子系统,如下
Pe文件静态分析

根据上述字段的描述,可以知道这个程序是一个图形化界面程序,因此会有对应的窗体供给用户交互。

如何查看是否被加壳了

查看PE结构

这里选用PEView来分析某个样本是否被加壳了,需要知道的是一个正常的样本,它的每个节区(例如.rdata .rsrc .text的虚拟大小Virtual Size和原始数据大小Size of Raw Data的大小应该一样大或者相差不多。如下是一个正常样本的.text的大小

正常样本
Pe文件静态分析

当一个样本被加壳了,则一些节区就会发生变化,例如被压缩的程序,如下是一个被themida压缩的程序,程序不存在.text节区,而是存在了.themida节区,虚拟大小的值要比原始数据的值大很多,可以确定程序应该被处理过了,如下
Pe文件静态分析

表明程序在运行时会释放数据到.themida节区,在磁盘上不占用大小。

使用工具

为了能更好的对比处使用PEView分析的结果(是否被themida压缩)正确,如下是对应的查壳工具分析的结果

DIE --Detect It Easy
Pe文件静态分析

查询结果:不存在壳 这个结果还是有点出乎意料,因为根据PE结果来看,这个存在一个压缩壳,估计是一个bug。

Exeinfo
Pe文件静态分析

查询结果是Themida,这个笔者分析的一致。

PEiD
Pe文件静态分析
查询结果为yoda's protector v1.02,估计这也是个bug问题,这里参考https://www.52pojie.cn/thread-146636-1-1.html

总结

根据工具分析和人工分析的结果来看,有时候工具也存在一些bug问题,此时可以人工分析,再来做一定的对比,或者多试试一些查壳工具等。

查看依赖的库

  • 查看导出函数
  • 查看导入函数

这里使用PeBear这个工具分析,重点关注到Imports这个选项,如下
Pe文件静态分析
从图中可以知道导入了库KERNEL32.DLL MSVCRT.DLL两个库,并且可以看到对应的导出函数。

从导出的函数中可以推测,程序会调用CreateFileA创建文件,并且使用FindFistFileA FindNextFileA执行遍历文件,之后可能会通过CopyFileA函数执行对应的复制等操作,这里会涉及到文件的操作。

查看字符串

在获取了一些基本的Api等函数信息后,进一步查找一些可能存在的特殊信息,这里可以选择查找一些字符串,Windows下查看字符串可以使用BinText来获取,如下
Pe文件静态分析
这里给出的字符串提示,程序会对系统造成一些危害行为,这对后面的汇编分析中会提供更多的帮助信息。

有些时候程序中的字符串被混淆加密了,此时只能先静态分析一些还是行为,接着在动态调试阶段来获取解密的内容。

静态分析总结

在平时的分析过程中,尤其是静态分的过程中要足够细心的去搜集更多的信息,能够从静态分析中获取程序的一些行为特征,尝试理解程序的行为并做大胆的猜测,之后在动态调试阶段去做针对性的验证实际分析的结果,可以加深对程序的理解。当然很多时候分析的时候都不全是很简单的就能完成的,可能静态分析阶段就被卡住了,例如程序可能被压缩加密,也可能被运行时修复(IAT)等,这些都是针对性的去做处理,没有什么东西是一蹴而几的,需要不断的做,去总结,然后一次次的失败一次次的再来,或许这就是很多人说的经验吧。