恶意文件分析总结
一.对待分析样本要有初步的整体认识
在拿到一个待分析的样本时,首先要判断下这个样本是什么语言编写,什么编译器编译的,是否加壳,是否引用了特殊库,不同实现的样本有不同的分析技巧。通常使用Detect-It-Easy来判断文件编译器信息,库信息。在Detect-It-Easy无法判断出信息时,可以粗略的看下样本入口点代码特征和语言特定的字符串特征来判断文件类型信息,这些东西就是在日常分析过程中积累的。
在粗扫字符串同时也能看看是否存在域名,文件名,注册表键值名,函数名,版本信息,调试输出信息等特征字符,对样本的功能有个整体上的了解,后续阶段分析样本的过程就是逐步补充完善细节的过程。如果分析结果与前期推测不符,那样本中就可能使用的特殊的技术隐藏了相关行为。
(1)有些样本在观察过程中发现存在了大量正常样本中出现的特征,则就很有可能是二进制pacth正常文件
(2)域名,文件名,注册表键值名,函数名之类的信息能快速推导出相关功能代码的位置,对于结构复杂的样本就是个很好的突破点。
(3)VirusTotal等外部引擎的病毒名也能作为样本大致功能的判断依据。
二.分析中总结,积累代码结构特征,行为特征
在我们分析一个没有调试符号的恶意样本时,IDA通常会反汇编出数百甚至上千个未命名的函数,我们不可能每次都一个个得去看这些函数实现的功能。这时候就需要总结一些常见的函数代码结构特征,分析时直接跳过这些函数。
这需要我们在平时分析样本时关注并总结一些特定函数实现的特征,不能只通过x64dbg等调试器一路调试到底。最好能学习一些能找到的病毒源码,对着源码看无符号时IDA反汇编的结果。
1.熟悉常见编程语言及编译器实现细节,跳过无关实现
(1)在C/C++代码中,最常见的无关代码就是编译器插入的C/C++运行时初始化代码,即在用户自定义的入口点函数(mian函数)前执行的环境初始化函数(DllMainCRTStartup,MainCRTStartup函数)等。
2.熟悉常见的恶意软件技术实现细节,关联并推导函数功能。
(1)常见功能的执行流程,从一个函数推导出相关联的函数功能
以勒索样本为例,如果找到了遍历路径的函数,就能迅速推导出前期准备,文件加密相关代码的大致位置
(2)常见功能函数的签名信息(参数,返回值),代码结构,直接推导功能
最常见的函数是加载DLL,解析函数符号,这是每个Shellcode都会做的一项准备工作。加载DLL函数返回的是模块地址,参数一般只有1个,可能为模块地址,也可能是模块名hash。解析函数符号的函数返回函数地址,参数通常为2个,一个模块相关,一个函数名相关。
三.从局部到整体,逐步补全拼图
有时候待分析的样本具备执行流程混乱(如C++虚函数),函数众多(MFC)等复杂的结构,这时候就难以重头分析到尾,线性分析完整个样本的执行逻辑。这时候最好观察样本本身是否存在一些可以定位模些功能具体实现代码的特征,从这些特征入手,定位实现出么个特定功能的函数,再前后推导关联逻辑。常见的特征有很多,有语言相关的,也有语言无关的,仔细观察说不定能发现写惊喜。
(1)有些C++代码虽然去除了调试符号,但是用于异常的RTTI信息并未去除,从RTTI信息中也能得到部分类的实现信息。
(2)如果调试时难以找到相关功能的定位,可以参考样本的行为日志,通过实现功能的底层Windows函数来向上推导实现逻辑。