本书前三章是对简单的恶意代码静态分析基础技术的概述,是分析恶意代码学习的入门。
第零章 恶意代码分析技术入门
第一章 静态分析基础技术
1. 字符串Strings
-
存储形式:ASCII或Unicode
- ASCII 每个字符1字节 - Unicode 每个字符2字节
-
Strings搜索程序:忽略上下文和格式,从整个文件中检测可打印字符串。
-
用户:过滤无效字符串,通过有意义的字符串获得一些简单代码的信息。
2. 文件加壳与PEiD
-
混淆程序:恶意代码编写者尝试隐藏其执行过程的代码。
-
加壳程序:混淆程序的一类。被压缩或加密,显露的字符串很少,直接分析困难。
加壳或混淆代码通常至少会包含LoadLibrary和GetProAddress函数,用于加载和使用其它函数功能。
3. PE文件格式
PE文件格式是Windows可执行文件、对象代码和DLL所使用的标准格式。
PE 文件结构 | DOS 文件头 |
PE 文件头 | |
区块表 | |
区块 | |
调试信息 |
-
PE文件格式实际上是一种数据结构,包含为Windows操作系统加载器管理可执行代码所必要的信息。
-
PE是指Windows系统下32位可执行文件,以一个文件头开始,其中包括代码信息,应用程序类型,所需的库函数与空间要求。
-
PE文件中常见的分节:
.text:包含了CPU的执行指令,正常是唯一包含代码的节。 .rdata:通常包含导入导出的函数信息,还可以存储程序中的其他只读数据。 .data:包含了程序的全局数据 (本地数据并不存储在这里)。 .rsrc:包含可执行文件使用的资源,内容并不执行,例如图标、菜单项、字符串等 .reloc:包含用于重定位文件库的信息 .pdata:只在64位可执行文件中存在,存储异常处理信息
-
PE文件格式详解示意图
4. 链接库与函数
对一个可执行程序,可以搜集到的最有用的信息之一就是:导入表。
程序员将一些导入函数和代码库链接到编写的主程序中。
(1)静态链接
- Windows平台上不常用,Unix和Linux程序中比较常见。
- 库被静态链接时,所有这个库中的代码都会被复制到可执行程序中。
- PE文件头中没有迹象——难以区分静态链接的代码和可执行程序自身代码。
一些Windows API允许程序员导入没有在程序的文件头中列出的连接函数。
- 最为常见的就是:
LoadLibrary
和GetProcAddress
- 允许一个程序访问系统上任何库中的任何函数。
(2)动态链接
- 最常见、最应该关注。
- 库被动态链接时,宿主操作系统会在程序被装载时搜索所需的代码库,如果程序调用了被链接的库函数,这个函数会在代码库中执行。
- PE文件头中存储了每个将被装载的库文件,以及每个会被程序使用的函数信息。
(3)常见的dll程序
DLL | 描 述 |
---|---|
Kernel32.dll | 常见,包含核心系统功能,如访问和操作内存、文件和硬件 |
Advapi32.dll | 提供对核心Windows组件的访问,如服务管理器和注册表 |
User32.dll | 包含所有用户界面组件,如按钮、滚动条以及控制和响应用户操作的组件 |
Gdi32.dll | 包含图形显示和操作的函数 |
Ntdll.dll | Windows内核接口,可执行文件一般通过Kernel32.dll间接导入。说明作者企图使用非正常Windows函数,如隐藏功能和操作进程等任务 |
Wsock32.dll | 联网DLL,执行访问网络操作或相关任务 |
Ws2_32.dll | |
Wininet.dll | 包含更高层次的网络函数,实现了如、FTP、HTTP和NTP协议 |
-
函数命名约定(前缀或后缀)
Ex:管理层,Ex是Executive的开头两个字母。 Ke:核心层,Ke是Kernel的开头两个字母。 Hal:硬件抽象层,Hal是Hardware Abstraction Layer的缩写。 Ob:对象管理,Ob是Object的开头两个字母。 Mm:内存管理,Mm是Memory Manager的缩写。 Ps:进程(线程)管理,Ps表示Process。 Se:安全管理,Se是Security的开头两个字母。 Io:I/O管理。 Fs:文件系统,Fs是File System的缩写。 Cc:文件缓存管理,Cc表示Cache。 Cm:系统配置管理,Cm是Configuration Manager的缩写。 Pp:"即插即用"管理,Pp表示PnP。 Rtl:运行时程序库,Rtl是Runtime Library的缩写。
(4)导入导出函数
- 导入函数:一个程序所使用的但存储在另一个程序中的那些函数。
- 导出函数:用来与其他程序交互时使用的函数
DLL文件本身就是实现一些导出函数然后被exe可执行文件使用的,故其中导出函数多而常见。
EXE文件中鲜有导出函数,若有,则应特别关注。
5. 工具及实践
第二章 在虚拟机中分析恶意代码
参考资料
参考资料1:Windows内核函数的命名
参考资料2:从入门开始:恶意代码的那些事