恶意代码的静态分析技术

jopen 8年前
 

0×00 概述

静态分析技术通常是研究恶意代码的第一步,是分析程序指令与结构来确定功能的过程,此时程序不是在运行状态的。

1. 反病毒软件确认程序样本恶意性  2. 使用hash识别恶意代码  3. 文件的字符串列表,使用函数还有文件头信息分析

尽可能多的搜集信息,对目标就更加了解。

0×01 反病毒扫描

反病毒软件显然不完美,主要依靠恶意代码特征片段的匹配(病毒文件特征库),还有基于行为模式的匹配分析(启发式检测)

恶意代码编写者很容易修改或者转化自己的特征代码片段,启发式检测也仍然会被新型的恶意代码绕过。

不同的反病毒软件使用了不同的特征库和启发式检测方法。

Virustotal网站允许你上传一个文件,调用多个反病毒引擎进行扫描,并生成一份报告

https://www.virustotal.com/  扫描结果提供了各个引擎对样本的识别情况,

恶意代码的静态分析技术

图1 扫描结果

传说还有相当多的黑客利用网站帮助其修改恶意代码,然而谷歌官方也能通过分析提交的恶意代码跟踪黑客修改软件的过程,甚至反向定位黑客。

0×02 恶意代码的指纹

hash是唯一标识恶意代码的常用方法,SHA-1算法,MD5算法是最常用的两种hash函数。

恶意代码的静态分析技术

图2 Kali中的md5deep

0×03查找字符串

程序中的字符串就是一段可打印的字符序列,从其中会包含很多信息,比如弹出的消息,读取的位置,链接的URL等等。

使用Kali中的Strings程序搜索可执行文件的字符串,通常以Unicode和ASCII格式存储。

两种类型格式都以NULL结束符,表示字符串是完整的 ASCII字符串每个字符使用一个字节,Unicode使用两个字节。

然而有些时候检测到的也并非是真正的字符串,可能是内存地址,CPU指令序列。

0×04 加壳与混淆恶意代码

加壳后的恶意程序会被压缩,混淆技术则隐藏了执行的过程。

有时候使用Strings程序只搜索出很少的字符串,大部分是加壳或者混淆的,但是此类程序至少会有两个函数LoadLibrary和GetProcAddress 用来加载和使用其他函数。

加壳程序运行先自身脱壳解压缩自身的文件,然后在运行,我们利用静态分析只能看到外面的脱壳代码。

0×05 PEID检测加壳

PEID来检测加壳的类型和所用编译器的类型,简化加壳分析的过程,

加入一个简单的恶意代码 PEID识别了加壳的类型

恶意代码的静态分析技术

图3

UPX加壳工具非常流行 但是UPX也非常容易脱壳http://upx.sourceforge.net/ 下载工具就好Warning: PEID 0.92中也存在缓冲区溢出漏洞,它和其他的程序一样,也许也会被黑客利用误导分析人员。

许多PEID插件会在不知情的情况下运行恶意代码可执行文件,注意在安全的环境下运行。

0×06 链接库与函数

对于分析恶意代码,收集它的导入表至关重要,导入表是一个程序使用的存储于另一个程序的那些函数。

静态链接(库与程序静态链接时,库中的所有代码都会复制到程序中,程序增大很多)常见于UNIX和Linux系统中,而Windows中都是动态链接(只有在程序运行时才链接到库)

DLL文件又称应用程序拓展,在Win中许多应用程序并不是一个完整的可执行文件,它们被分割成相对独立的动态链接库,DLL文件。

1. 不要把库包含在程序中需要时调用即可  2. 内存映射技术使加载后的DLL代码,资源在多个进程之间实现共享  3. 更新库时只要替换DLL即可方便快捷

0×07 Dependency Walker工具查看动态链接函数

恶意代码的静态分析技术

图4

常见的DLL程序:

Kernal.dll 包含系统的核心功能,访问和操作内存,文件,硬件  WININET.dll 联网操作 包含了FTP HTTP NTP等协议  User.dll 包含了用户界面组件,控制响应用户操作的组件  Ntdll.dll 是Windows内核的接口 通常由Kernal间接导入,一些隐藏功能和操作进程会使用这个接口。  Advapi32.dll 提供了对核心Windows组件的访问 ,比如服务管理器和注册表  Gdi32.dll  提供图形显示和操作的函数

0×08 PE文件头与分节

PE文件是Windows系统下使用的可执行文件格式,它是微软在UNIX平台的COFF(Common Object File Format 通用对象文件格式)基础上制作而成。最初设计用来提高在不同系统上的移植性,其实只能用在Windows操作系统上。

PE是指32位可执行文件,64位的可执行文件称为PE+ 或者PE32+,并非PE64。

PE文件以一个文件头开始,其中包括代码信息,应用程序类型,所需的库函数与空间要求。

PE文件中常见的分节:

.text 包含了CPU的执行指令,正常是唯一包含代码的节。  .rdata 通常包含导入导出的函数信息,还可以存储程序中的其他只读数据  .data 包含了程序的全局数据 (本地数据并不存储在这里)  .rsrc 包含可执行文件使用的资源,内容并不执行,例如 图标,菜单项,字符串等  .reloc 包含用于重定位文件库的信息

0×09 一个小实验

我们先在Kali中用Strings程序看一下样本中的字符串,虽然没有显示出很多字符串,至少也得到了一部分信息。引入了WININET.dll和InternetOpenA函数说明会连接网络。还看到了一个网址可能是上述函数要连的网址。

恶意代码的静态分析技术

接着我们用PEview打开文件,没有看到常用的PE节却看到了.UPX0/1/2 明显是UPX加密的痕迹 其中UPX0 虚拟大小为0×400 却没有原始数据 很可能包含了恶意代码。

恶意代码的静态分析技术

PEID扫描结果看出是UPX加壳:

恶意代码的静态分析技术

利用命令行工具UPX脱壳:

恶意代码的静态分析技术

脱壳后重新PEview 这时就可以看到正常的PE节了,PE节的名称都很固定任何特殊的PE节都是可疑的,同时还观察到 NT头IMAGE_OPTIONAL_HEADER 中的Subsystem CUI表示是命令行程序:

恶意代码的静态分析技术