目录
1.6.2 使用Dependency Walker工具探索动态链接函数
1.7.1 PotentialKeylogger.exe :一个未加壳的可执行文件
1.8.2 使用Resource Hacker工具来查看资源节
1.1 反病毒引擎扫描:实用的第一步
基于行为与模式匹配的分析(启发式检测)
不同的反病毒软件使用了不同的特征库和启发式检测方法
在VirusTotal上上传样本,网站会调用多个扫描引擎来扫描
1.2 哈希值:恶意代码的指纹
哈希是一种用来唯一标识恶意代码的常用方法
MD5和SHA-1用得比较多
1.3 查找字符串
URL:可以理解为一个网址
ASCII和Unicode都以NULL结束符表示字符串已经终结,一个NULL结束符表示该字符串是完整的
Unicode的0x00在后面
通常情况下,如果一个字符串很短而且不是一个单词的话,它很有可能是毫无意义的
1.4 加壳与混淆恶意代码
一个合法的程序总是会包含很多字符串,加壳或混淆之后能读到的字符串就会很少
加壳和混淆代码通常至少包含LoadLibrary 和 GetProcAddress,他们是用来加载和使用其他函数功能的
1.4.1 文件加壳
加壳的程序运行时,首先会运行一小段脱壳代码,来解压缩加壳的文件,然后再运行脱壳后的文件
当对一个加壳程序进行静态分析时,只有这一小段脱壳代码能够被解析
1.4.2 使用PEiD检测加壳
很多PEiD插件会在没有警告的情况下运行恶意代码的可执行文件
1.5 PE文件格式
文件格式可以揭示出很多关于程序功能的信息
PE:可移植执行文件是Windows可执行文件、对象代码和DLL所使用的标准格式。
PE格式其实是一种数据结构,包含了为Windows操作系统加载器管理可执行代码所必要的信息
PE文件以一个文件头开始,其中包括代码信息、应用程序类型、所需的库函数与空间要求
PE头中的信息是非常有价值的
1.6 链接库与函数
一个可执行程序,能收集到的最有用信息之一:导入表
了解代码库是如何被链接的,对于分析理解恶意代码来说是很关键的,因为在PE文件头中可以找到的信息取决于链接了哪些代码库
1.6.1 静态链接、运行时链接与动态链接
静态链接:是Windows平台链接代码库最不常用的方法,当一个库被静态链接到可以执行程序时,库中的所有代码都会被复制到可执行文件中
在分析代码时,很难区分静态链接库的代码和可执行文件的代码,因为PE头中没有迹象表明这个文件包含有链接代码
运行时链接:加壳或者混淆的恶意代码用得比较多,使用运行时链接的程序,只有当需要使用的函数时,才链接到库,而不是像动态链接模式那样在程序启动时就会链接
一些Windows API允许程序员导入并没有在程序的文件头列出的链接函数,两个最为常见的是LoadLibrary和GetProcAddress。LdrGetProcAddress和LdrLoadDll也会被使用。LoadLibrary和GetProcAddress允许一个程序访问系统上任何库的任何函数,当程序调用了这些函数的时候,无法静态分析程序中链接了哪些函数
在所有的链接方法中,动态链接最为常见,当代码库被动态链接时,操作系统会在程序被装载时搜索所需要的代码库。
PE文件头中存储了每个将被装载的库文件,以及每个会被程序使用的函数信息
1.6.2 使用Dependency Walker工具探索动态链接函数
包含在VS的开发包中,支持列出可执行文件的动态链接函数
①表示分析的文件 ②显示了程序的导入DLL列表
单击左侧的DLL,③中显示导入表,④列出了DLL中所有可以被导入的函数
③和④中的列都标注着序号,可执行文件是根据序号,而不是根据名字来导入函数。当根据序号来导入函数的时候,名称就不会显示
⑤显示运行程序的时候装载的DLL版本额外信息,⑥显示报告的错误
常见的DLL:
1.6.3 导入函数
windows函数的这些名字,可以告诉你这个可执行文件到底干了些什么事情
1.6.4 导出函数
Dll和exe的导出函数,是用来与其他程序和代码就行交互时所使用的。通常一个Dll会实现一个或多个功能函数,然后将他们导出,使得别的程序可以导入并使用这些函数
因为Dll本身很多时候就是为了实现导出函数而写的,所以导出函数在Dll中最常见。一般exe很少提供导出函数
很多时候函数名能够提供很多有用信息,为了将程序以服务的方式运行,必须首先定义一个ServiceMain函数。如果存在一个导出函数名字为ServiceMain,那么这个恶意代码将会作为服务的一部分运行
但是导出函数的名称可以随意取,所以也不能完全根据名称来判断恶意代码的行为,很多时候导出函数的名称要么省略,要么使用不明确或者误导性的名字
1.7 静态分析技术实践
分析一个可疑的键盘记录器样本,一个加壳程序
1.7.1 PotentialKeylogger.exe :一个未加壳的可执行文件
能够看到很多导入函数,说明程序没有加壳
图形化界面操作函数:
RegisterClassEx:注册窗口,之后再调用CreateWindow
SetWindowsHookEx:是间谍软件经常使用的函数,也是键盘记录仪用来接收键盘输入的最流行的方法
RegisterHotKey:注册热键,当用户按下热键组合之后,无论当前是哪个程序处于活动状态,热键都会将用户带到注册了热键的程序
Shell32.dll
CommandLineToArgvW:可以理解为把一个Unicode字符串转换并返回一个指向命令行参数的数组指针和参数计数,跟C中的argc/argv功能类似
这个出现的情况应该是程序中有命令行字符串,通过这个函数可以使这个命令运行起来
SHChangeNotify:通知系统已经执行的事件
ShellExcute:可以识别任何文件的名字,并打开,也可以打开网页
Advapi32.dll
主要是一些注册表相关的API
1.7.2 PackedProgram.exe:穷途末路
这个程序的导入函数很少,所以能够判断这个程序加壳了,具体的脱壳需要用到动态调试
1.8 PE文件头与分节
.text:包含了CPU执行指令,所有其他节存储数据和支持性的信息。一般来说,这是唯一可以执行的节,也应该是唯一包含代码的节
.rdata:通常包含导入与导出函数信息,还可以存储程序所使用的其他只读数据,有些文件还会包含.idata和.edata,来存储导入信息
.rsrc:包含由可执行文件所使用的资源,这些内容并不是可执行的,比如图标,图片,菜单项和字符串。字符串可以存储在.rsrc节中,或者主程序里。在.rsrc节中存储的字符串是为了提供多种语言支持的
节名称在同一个编译器里面编译出来的名称是相同的,但是在不同的编译器可能会有不同的名字
比如VS中使用.text作为可执行代码的名称,在Borland的Delphi使用CODE
分节的名称有时候也会被混淆,大多数情况下使用的都是默认名称
1.8.1 使用PEview来分析PE文件
①显示的是PE文件头的主要部分,PE头部两个部分IMAGE_DOS_HEADER和MS-DOS存根程序,是历史遗留问题,不需要关注
②显示了IMAGE_FILE_HEADER包含了关于文件的基本信息
③处的时间戳告诉了可执行文件是什么时候编译的,但是不一定很可靠。比如Delphi使用的是统一的编译时间,1992年6月19
如果看到这个时间,很有可能是在看一个Delphi程序。这个时间可以伪造。
IMAGE_OPTIONAL_HEADER:
Subsystem指出这是一个控制台程序还是图形界面程序
控制台的值是IMAGE_SUBSYSTEM_WINDOWS_CUI
图形界面的值是IMAGE_SUBSYSTEM_WINDOWS_GUI
还有一些不太常见的系统,比如说Native和Xbox等
PE文件头最有趣的信息来自于分节头部描述信息,在IMAGE_SECTION_HEADER中,用来描述PE文件的各个分节。
编译器通常会创建和命名一个可执行文件的各个分节,而用户几乎无法控制这些名称。所以这些分节的名称通常情况下是一致的,任何偏差都是可疑的
①处的虚拟大小告诉我们在加载过程中需要分配多少空间给一个分节
②处的原始大小显示在磁盘上这个分节的大小规模
这两个值应该是相等的,因为数据在内存中只需要与磁盘一样多的空间。一些小的差别也是正常的,由于内存和磁盘上的对齐存在差异
分节的大小在检测加壳的程序非常有用。
.text .rdata .rsrc每个分节都拥有一个虚拟大小和原始数据大小,两者都是相同的,或者说差别不大
下面的.data分节很可疑,因为虚拟大小比原始大小要大得多,但是对于windows程序的.data分节来说是正常的,但是也不能说明这个程序不是恶意的
下面程序的分节有一些可疑的地方:
异常的分节名称
.text分节的数据大小为0,也就是说他在磁盘上不需要任何空间,而虚拟大小的值是A000,这意味着windows将会为.text分节分配内存空间,也就是加壳器将会脱出可执行代码到一个分配的.text中
1.8.2 使用Resource Hacker工具来查看资源节
分析计算器程序
①处显示的每个根目录都存储了一种不同类型的资源
对于恶意代码分析能够提供的有用信息包括:
图标部分列出了当可执行文件在文件列表中显示时所使用的图标文件
菜单部分存储了所有出现在各个窗口的菜单,如File,Edit等。这部分包含了所有菜单项的名称,以及显示的文字。能够从菜单项中理解他们的功能
对话框部分包含了程序的对话框项。在②处的对话框显示了用户在运行calc.exe所看到的那个界面
字符串存储了字符串列表
版本信息包含了一个版本序列号,经常有公司名称和版权声
需要注意的是,恶意代码或者一些合法软件,经常会把一个嵌入的程序或者驱动放在资源节中,在程序运行之前,它们会将嵌入可执行文件或者驱动提取出来,可以通过Resource Hacker提取出来这些文件单独分析
1.8.3 使用其他的PE文件工具
PEBrowse Professional与PEview类似,允许查看每个分节中的字节,并显示出解析后的数据,在.rsrc获取信息上做得更好
PE Explore 有丰富的图形用户界面,可以编辑PE文件的特定部分,它所包含的资源编辑器对于浏览和编辑文件资源来说是分成棒的
1.8.4 PE文件头概述
1.9 小结
利用上述的工具,就可以对恶意代码进行静态分析,来获取对它功能的一些观察