本文是基于计算机病毒课程实践部分的总结,这些实践是自主尝试学习分析恶意代码的过程,如有疏漏不妥之处,还请不吝赐教!
我的相关博客
- 实践部分:计算机病毒实践汇总一:简单静态分析(分析程序)
- 读书部分:《恶意代码分析实战》读书笔记 入门与基础
恶意代码简单静态分析实践总结
1. 目标
静态分析技术是研究恶意代码的第一步,通过各种工具尽可能多的搜集其信息并找到进一步分析的思路。
- 确认程序恶意性
- 判断程序主要行为
- 简单信息分析
2. 反病毒扫描
利用一些网站集合的病毒文件特征库进行恶意代码特征片段的匹配,为判断程序恶意性提供参考。
- 可利用的一些网站
- virustotal(360浏览器无法正常打开?)
- VirSCAN
- Jotti的恶意软件扫描程序
- 调用多个反病毒引擎进行扫描。
- 扫描结果提供了各个引擎对样本的识别情况。
3. 加壳与混淆后的恶意代码
加壳后的恶意程序会被压缩或加密处理,混淆技术则隐藏了执行的过程。
加壳程序特点:至少会有两个函数
LoadLibrary
和GetProcAddress
用来加载和使用其他函数。- 使用PEiD工具
-
检测加壳的类型和所用编译器的类型,简化加壳分析的过程。
-
查看PE文件的分节
-
查看导入函数
存在问题:许多PEID插件会运行恶意代码可执行文件,注意在虚拟机的环境下运行。
4. 链接库与导入导出函数
分析恶意代码,可以其链接库和导入导出函数了解程序的行为。
-
静态链接与动态链接
库与程序静态链接时,库中的所有代码都会复制到程序中,程序增大很多,常见于UNIX和Linux系统中。
Windows中多为动态链接,只有在程序运行时才链接到库。 DLL文件:动态链接库文件。可执行文件常被分成这样的一个个具有相对独立功能的dll文件。
-
使用Dependency Walker工具
- 模块依赖关系、导入导出函数、模块列表、日志
- PI(Parent Import Function List View):从哪些其他文件中调用了函数。
- E(Export Function List View):提供了哪些接口,让其他的程序调用。
-
常见的DLL程序:
Kernal.dll 包含系统的核心功能,访问和操作内存,文件,硬件
WININET.dll 联网操作 包含了FTP HTTP NTP等协议
User.dll 包含了用户界面组件,控制响应用户操作的组件
Ntdll.dll 是Windows内核的接口 通常由Kernal间接导入,一些隐藏功能和操作进程会使用这个接口。
Advapi32.dll 提供了对核心Windows组件的访问 ,比如服务管理器和注册表
Gdi32.dll 提供图形显示和操作的函数
5. PE文件头与分节
PE是指Windows系统下32位可执行文件,以一个文件头开始,其中包括代码信息,应用程序类型,所需的库函数与空间要求。
-
PE文件中常见的分节:
.text:包含了CPU的执行指令,正常是唯一包含代码的节。
.rdata:通常包含导入导出的函数信息,还可以存储程序中的其他只读数据。
.data:包含了程序的全局数据 (本地数据并不存储在这里)。
.rsrc:包含可执行文件使用的资源,内容并不执行,例如图标、菜单项、字符串等
.reloc:包含用于重定位文件库的信息
.pdata:只在64位可执行文件中存在,存储异常处理信息 -
使用PEview工具
-
在这里或许可以找到有关恶意代码行为的线索。
- 编译信息:
IMAGE_NT_HEADERS
中的映像文件头IMAGE_FILE_HEADER
中“Time Date Stamp”可以获取可执行文件是什么时候编译的。 - 入口信息:在
IMAGE_OPTIONAL_HEADER
中第七个成员“AddressOfEntryPoint“,它持有OEP(程序的入口点)的RVA(相对虚拟地址)。
- 编译信息:
6. 综合分析
(1)整合线索
- 有着相同编译时间的动态链接库
- 有特定行为的关键导入导出函数
- 分节中的信息
(2)联系实际
- 能与系统实际文件相关的线索
- 与端口号相关的线索 -> 特定的服务
- 与某个网络地址相关的线索
(3)做出推断
- 是否是恶意代码?
- 它做了什么?
- 主机已经感染的特征?