本书前三章是对简单的恶意代码静态分析基础技术的概述,是分析恶意代码学习的入门。

第零章 恶意代码分析技术入门


第一章 静态分析基础技术

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文件格式详解示意图

    图片来源:吾爱破解论坛 > 软件安全 > 脱壳破解区 > PE文件结构图

4. 链接库与函数

对一个可执行程序,可以搜集到的最有用的信息之一就是:导入表。
程序员将一些导入函数和代码库链接到编写的主程序中。

(1)静态链接

  • Windows平台上不常用,Unix和Linux程序中比较常见。
  • 库被静态链接时,所有这个库中的代码都会被复制到可执行程序中。
  • PE文件头中没有迹象——难以区分静态链接的代码和可执行程序自身代码。

一些Windows API允许程序员导入没有在程序的文件头中列出的连接函数。
  • 最为常见的就是:LoadLibraryGetProcAddress
  • 允许一个程序访问系统上任何库中的任何函数。

(2)动态链接

  • 最常见、最应该关注。
  • 库被动态链接时,宿主操作系统会在程序被装载时搜索所需的代码库,如果程序调用了被链接的库函数,这个函数会在代码库中执行。
  • PE文件头中存储了每个将被装载的库文件,以及每个会被程序使用的函数信息。

(3)常见的dll程序

DLL描 述
Kernel32.dll常见,包含核心系统功能,如访问和操作内存、文件和硬件
Advapi32.dll提供对核心Windows组件的访问,如服务管理器和注册表
User32.dll包含所有用户界面组件,如按钮、滚动条以及控制和响应用户操作的组件
Gdi32.dll包含图形显示和操作的函数
Ntdll.dllWindows内核接口,可执行文件一般通过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:从入门开始:恶意代码的那些事