本文是基于计算机病毒课程实践部分的总结,这些实践是自主尝试学习分析恶意代码的过程,如有疏漏不妥之处,还请不吝赐教!

我的相关博客

恶意代码简单静态分析实践总结

1. 目标

静态分析技术是研究恶意代码的第一步,通过各种工具尽可能多的搜集其信息并找到进一步分析的思路。
  • 确认程序恶意性
  • 判断程序主要行为
  • 简单信息分析

2. 反病毒扫描

利用一些网站集合的病毒文件特征库进行恶意代码特征片段的匹配,为判断程序恶意性提供参考。

3. 加壳与混淆后的恶意代码

加壳后的恶意程序会被压缩或加密处理,混淆技术则隐藏了执行的过程。
  • 加壳程序特点:至少会有两个函数LoadLibraryGetProcAddress用来加载和使用其他函数。

  • 使用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)做出推断

- 是否是恶意代码?
- 它做了什么?
- 主机已经感染的特征?