静态分析基础技术

这是《恶意代码分析实战》一书第1章的笔记

注意,文中的连接都有多是恶意的,请勿随意点击

1.反病毒引擎扫描

1-1.Virus Total

相似VirusTotal这样的网站容许你上传一个文件,而后调用多个反病毒引擎来扫描。VirusTotal网站会生成一份报告,其中提供了全部引擎对这个样本的识别状况、标识这个样本是否恶意、恶意代码名称,以及其余额外信息。程序员

2.哈希值

哈希是一种用来惟一标识恶意代码的经常使用方法。恶意代码样本经过一个哈希程序,会产生一段用于惟一标识这个样本的独特哈希值(相似于一种指纹)github

2-1.md5deep

从这个网站下载md5deep-4.4.zip,解压后有一堆.exe文件,包括32位的和64位的md5deep、hashdeep等,可是双击打开我不会用。书上是在命令行中运行的,因而我想到了Python配置环境变量,如法炮制,果真能够在命令行中使用了。
额
使用例子:
计算Windows操做系统自带的sort程序哈希值
恶意代码3api

2-2.WinMD5

这是WinMD5Free v1.20的下载地址,这个版本只能同时计算和显示一个文件的哈希值,能够输入其本来哈希值进行比对。
额
这是WinMD5 v2.07的[下载地址]http://www.blisstonia.com/software/WinMD5/),这也是书中使用的版本。
WinMD5是图形化界面的,能够同时计算和显示出多个文件的哈希值。一旦你对一个恶意代码样本拥有了一段独特哈希值以后,你能够把它用做以下用途:
* 将哈希值做为标签使用。
* 与其余分析师分享哈希值,以帮助他们来识别恶意代码。
* 在线搜索这段哈希值,看看这个文件是否已经被识别。
恶意代码5网络

3.查找字符串

一个程序会包含一些字符串,好比打印出的消息、链接的URL,或是复制文件到某个特定位置。ide

3-1.Strings程序

在这个网站,微软本身的,下载下来解压后第一次双击运行会须要点一个Agree之类的东西,抱歉没有截图。以后就能够在命令行直接运行了(第二次开始若是双击运行strings.exe或strings64.exe则会闪退..),不须要手动配置环境变量。(可是见鬼我只能用strings.exe而不能用strings64.exe)
恶意代码6
Strings程序搜索三个及以上连续的ASCII或Unicode字符,并以终结符结尾的可打印字符串。
有些时候Strings程序检测到的字符串并不是是真正的字符串,它们多是一个内存地址、CPU指令序列,或是由哪一个程序所使用的一段数据。这就须要用户本身来过滤了。通常来讲,若是一个字符串很短并且不是一个单词的话,他就多是毫无心义的。函数

4.加壳与混淆恶意代码

  • 注意:**加壳和混淆代码一般至少会包含 LoadLibrary 和 GetProcAddress 函数,它们是用来加载和使用其余函数功能的。

4-1.文件加壳

当加壳的程序运行时,会首先运行一小段脱壳代码,来解压缩加壳的文件,而后再运行脱壳后的文件。当咱们对一个加壳程序进行静态分析时,只有这一小段脱壳代码能够被解析。工具

4-2.使用PEiD检测加壳

注意:许多PEiD插件会在没有警告的状况下运行恶意代码的可执行文件!网站

4-3.使用UPX工具脱壳

下载地址
能够方便地对使用UPX加壳的恶意代码进行脱壳。下载后在命令行对应路径使用便可,通常带上-d选项。
ui

5.PE文件格式

Windows平台可执行PE文件中的分节

分节名称 描述
.text 包含可执行代码
.rdata 包含程序中全局可访问的只读数据
.data 存储程序中均可以访问的全局数据
.idata 有时会显示和存储导入函数信息,若是这个节不存在时,导入函数信息会存储在.rdata节中
.edata 有时会显示和存储导出函数信息,若是这个节不存在时,导出函数会存储在.rdata节中
.pdata 只在64位可执行文件中存在,存储异常处理信息
.rsrc 存储可执行文件所需的资源
.reloc 包含用来重定位库文件的信息

6.连接库与函数

6-1.静态连接、运行时连接与动态连接

静态连接在Windows平台连接代码库不经常使用,在UNIX和Linux程序中常见。当一个库被静态连接到可执行程序时,全部这个库中的代码都会被复制到可执行程序中,这会让可执行程序增大许多。而在分析代码时,很难区分静态连接的代码与可执行程序自身代码,由于在PE文件头中没有迹象代表这个文件含有连接代码。

运行时连接在合法程序中并不流行,可是在恶意代码中是经常使用的,特别当恶意代码被加壳或混淆的时候。使用运行时连接的可执行程序,只有当须要使用函数时,才连接到库,而不是像动态连接模式那样在程序启动时就会连接。

一些Windows API容许程序员导入并无在程序的文件头中列出的连接函数。其中,两个最为常见的是LoadLibrary和GetProcAddres。LdrGetProcAddress和LdrLoadDll也会被使用。LoadLibrary和GetProcAddress容许一个程序访问系统上任何库中的任何函数,这意味着当这些函数被使用时,你没法静态分析出可疑样本程序中会连接哪些函数。

动态连接(DLL)最为常见,对于恶意代码师也是最应该关注的。当代码库被动态连接时,宿主操做系统会在程序被装载时搜索所需的代码库,若是程序调用了被连接的库函数,这个函数会在代码库中执行。

PE文件头中存储了每一个将被装载的库函数,以及每一个会被程序使用的函数信息。这些信息能够帮助咱们猜想恶意代码干了什么。如,若一个程序导入了URLDownloadToFile函数,你就能够猜想它会链接到互联网下载一些内容,而后在本地文件中进行存储。

6-2.使用Dependency Walker工具探索动态连接函数

Dependency Walker工具包含在微软Visual Studio的一些版本与其余微软开发包中,支持列出可执行文件的动态连接函数。
常见的DLL程序

DLL 描述
Kernel32.dll 这是一个很常见的DLL,它包含核心系统功能,如访问和操做内存、文件和硬件,等等
Advapi32.dll 这个DLL提供了对核心Windows组件的访问,好比服务管理器和注册表
User32.dll 这个DLL中包含了全部用户界面组件,如按钮、滚动条以及控制和响应用户操做的组件
Gdi32.dll 这个DLL中包含了图形显示和操做的函数
Ntdll.dll 这个DLL是Windows内核的接口。可执行文件一般不直接导入这个函数,而是由Kernel32.dll间接导入,若是一个可执行文件导入了这个文件,这意味着做者企图使用那些不是正常提供给Windows程序使用的函数。一些隐藏功能和操做进程等任务会使用这个借口
Wsock32.dll和Ws2_32.dll 这两个是联网DLL,访问其中任一个DLL的程序很是可能链接网络,或是执行网络相关的任务
Wininet.dll 这个DLL包含了更高层次的网络函数,实现了如FTP、HTTP和NTP等协议
  • 函数命名约定:
    • 以Ex为后缀的函数名:微软更新一个函数后给新函数一个与旧函数相同的名字并加上Ex后缀,显著更新过两次的函数会有两个Ex后缀。Eg. CreateWindowEx
    • 以A或W为后缀的函数名:以字符串做为参数的函数的两个版本,后缀为A的输入参数类型为ASCII字符串,后缀为W的输入参数为宽字符字符串。在微软的文档搜索这个函数时,记得丢掉后缀的A或W。Eg. CreateDirectoryW

参考

Sikorski M, Honig A. Practical malware analysis: the hands-on guide to dissecting malicious software[M]. no starch press, 2012.

相关文章
相关标签/搜索