Pe文件静态分析
Pe文件静态分析能够获取到哪些信息
在分析一个样本之前,通常会需要静态分析,如何从PE文件格式中获取到需要的信息就很重要。只有在静态分析时对文件的一些布局信息有了理解,例如是是否被加壳了(虽然可以用查壳工具,但是还是需要知道一些原理),文件时图形化界面(GUI)还是命令执行程序(CUI)等信息的提取和掌握,分析时才会更清晰要做什么,做到心中有数。下面是在阅读《恶意软件分析实战》
第一章中的一些整理笔记,希望为后续的学习和分析中提供一些基础理论知识来支撑。
程序的基本信息特征
采集程序的md5 sha1 sha-256
的信息,之后到virutotal hybird anyrun
等在线沙箱去做分析,查看一些分析报告的信息。这里推荐使用hashmyfiles
,如下
使用上述特征到在线分析网站查找即可。如下是virutotal
的查找结果
程序的编译时间
使用PEView
查看PE
的IMAGE_NT_HEADERS-->IMAGE_FILE_HEADER-->Time Date Stamp
,如下
可以知道这程序是2018/01/21 Sun 00:27:26 UTC
被编译的,有些时候这个时间也不够准确,不过这个也靠我们自己去判断即可。有时候一个样本的出现时间很早的话,很多查杀软件都有了对应的特征,如果再次出现表明此程序是一个变种样本,值得窥探。
程序的子系统
程序的子系统是在IMAGE_OPTIANL_HEADER
下的SubSystem
字段中,通常主要分为IMAGE_SUBSYSTEM_WINDOWS_GUI
和IMAGE_SUBSYSTEM_WINDOWS_CUI
两个类型,第一个是图形化程序,第二个是一个命令执行程序,使用PEView
查看子系统,如下
根据上述字段的描述,可以知道这个程序是一个图形化界面程序,因此会有对应的窗体供给用户交互。
如何查看是否被加壳了
查看PE结构
这里选用PEView
来分析某个样本是否被加壳了,需要知道的是一个正常的样本,它的每个节区(例如.rdata .rsrc .text
的虚拟大小Virtual Size
和原始数据大小Size of Raw Data
的大小应该一样大或者相差不多。如下是一个正常样本的.text
的大小
正常样本
当一个样本被加壳了,则一些节区就会发生变化,例如被压缩的程序,如下是一个被themida
压缩的程序,程序不存在.text
节区,而是存在了.themida
节区,虚拟大小的值要比原始数据的值大很多,可以确定程序应该被处理过了,如下
表明程序在运行时会释放数据到.themida
节区,在磁盘上不占用大小。
使用工具
为了能更好的对比处使用PEView
分析的结果(是否被themida
压缩)正确,如下是对应的查壳工具分析的结果
DIE --Detect It Easy
查询结果:不存在壳
这个结果还是有点出乎意料,因为根据PE
结果来看,这个存在一个压缩壳,估计是一个bug。
Exeinfo
查询结果是Themida
,这个笔者分析的一致。
PEiD
查询结果为yoda's protector v1.02
,估计这也是个bug问题,这里参考https://www.52pojie.cn/thread-146636-1-1.html
总结
根据工具分析和人工分析的结果来看,有时候工具也存在一些bug问题,此时可以人工分析,再来做一定的对比,或者多试试一些查壳工具等。
查看依赖的库
- 查看导出函数
- 查看导入函数
这里使用PeBear
这个工具分析,重点关注到Imports
这个选项,如下
从图中可以知道导入了库KERNEL32.DLL MSVCRT.DLL
两个库,并且可以看到对应的导出函数。
从导出的函数中可以推测,程序会调用CreateFileA
创建文件,并且使用FindFistFileA FindNextFileA
执行遍历文件,之后可能会通过CopyFileA
函数执行对应的复制等操作,这里会涉及到文件的操作。
查看字符串
在获取了一些基本的Api
等函数信息后,进一步查找一些可能存在的特殊信息,这里可以选择查找一些字符串,Windows
下查看字符串可以使用BinText
来获取,如下
这里给出的字符串提示,程序会对系统造成一些危害行为,这对后面的汇编分析中会提供更多的帮助信息。
有些时候程序中的字符串被混淆加密了,此时只能先静态分析一些还是行为,接着在动态调试阶段来获取解密的内容。
静态分析总结
在平时的分析过程中,尤其是静态分的过程中要足够细心的去搜集更多的信息,能够从静态分析中获取程序的一些行为特征,尝试理解程序的行为并做大胆的猜测,之后在动态调试阶段去做针对性的验证实际分析的结果,可以加深对程序的理解。当然很多时候分析的时候都不全是很简单的就能完成的,可能静态分析阶段就被卡住了,例如程序可能被压缩加密,也可能被运行时修复(IAT)等,这些都是针对性的去做处理,没有什么东西是一蹴而几的,需要不断的做,去总结,然后一次次的失败一次次的再来,或许这就是很多人说的经验吧。