Mastering Malware Analysis Chapter 3

PE部分

之前学PE文件结构一直忽视了这个Rich头

通过Rich字符定位这个结构,Rich后紧跟的是一个校验和,他后面紧跟着的是XOR key,可以用它来解密Rich头的内容,一旦解密,就会包含编译这个程序的软件 的 各种各样的信息。

使用PE头信息用于静态分析

PE文件得到什么信息取决于需要回答什么问题。

怎样使用PE头来进行事件处理

Is this malware packed?

看节表的内容(比如UPX0等)或者导入表的数据(通常加了壳的会含有极少的API)

Is this malware a dropper or a downloader?

用Resource Hacker看资源表的数据,观察导入表中的函数,比如URLDownloadToFile或者ShellExecuteA等API

Does it connect to the Command & Control server(s) (C&C, or the attacker’s website)? And how?

还是看API,比如send, socket等

What other functionalities does this malware have?

出现FindFirstFileA可能是勒索病毒

出现Process32First, Process32Next,CreateRemoteThread可能是进程植入

出现TerminateProcess可能意味着需要终止应用程序,比如反病毒软件啥的

怎样使用PE头来进行威胁狩猎?

When was this sample created?

TimeDateStamp可以回答这个问题,不过他有可能被伪造,另一个鲜为人知的具有类似用途的字段是Export Directory(可用时)的TimeDateStamp值。

What’s the country of origin of these attackers?

可以通过TimeDateStamp来推断,因为大多数的情况下,是特定时区的9点-下午5点工作

数据目录表的一项与证书相关。一些应用程序由供应商签名了,但这些证书有时会被不同的恶意软件窃取和使用。

对于所有使用特定被盗证书的恶意样本s,它们很可能都是由同一参与者生成的。即使它们有不同的目的或针对不同的受害者,它们也可能是同一攻击者执行的不同活动。

PE加载和进程创建

进程是什么?

进程不仅仅是一个运行的应用程序的代表,他还是一个容器,包含所有的关于这个应用程序的信息。(英文书就是牛逼,这里说的通俗易懂)

这个容器存储着关于和这个进程相关的虚拟内存的信息,所有加载的DLLs, 打开的文件和socket,作为进程一部分的线程列表,进程ID等等等。

进程是内核中保存所有这些信息的结构,它作为一个实体来表示这个正在运行的可执行文件

线程

线程不仅仅是表示进程内部执行路径的实体(每个进程可以有一个或多个线程同时运行)。它也是内核中保存整个执行状态的结构,包括寄存器、堆栈信息和最后一个错误。

Windows中的每个线程在停止运行以恢复另一个线程之前都有一个小的时间框架(因为处理器内核的数量远远小于整个系统中运行的线程数量)。

当Windows将执行从一个线程更改到另一个线程时,它会对整个执行状态(寄存器、堆栈、指令指针等)进行快照,并将其保存在线程结构中,以便能够从停止的位置再次恢复它。

每一个线程都有1个栈,指令指针,错误处理函数,线程ID和TEB,如下图所示

进程创建

  1. 启动程序: ​当双击某个程序的时候,explorer.exe调用CreateProcess来请求操作系统创建进程和开始执行。
  2. 创建进程数据结构: ​在内核空间中创建EPROCESS,设置PID和PPID
  3. 初始化虚拟内存: ​Windows创建进程,准备虚拟内存,在EPROCESS中保存映射,然后创建PEB,加载2个DLL,ntdll.dll和kernel32.dll
  4. 加载PE文件: ​在那之后,Windows开始加载PE文件,加载所有要求的第三方DLLS,以及这些DLL需要的DLL,确保能发现APIs,然后保存地址在导入表当中。
  5. 开始执行:Windows创建了第一个线程,他做了许多初始化的工作然后CALL PE文件的Entry Point,TLS callback如果有的话,将会在Entry Point前执行

WOW64 process

32位的程序如何运行在64位的操作系统上

对于这种特殊情况,Windows创建了所谓的WOW64子系统。主要在以下dll中实现:

•wow64.dll

•wow64cpu.dll

•wow64win.dll

这些dll为32位进程创建模拟环境,其中包括它可能需要的32位版本的库

另外 IsWow64Process 这个API可以用来判断32位的程序是运行在X86环境下还是X64环境下

调试恶意服务

What is a service?

服务是一些在后台执行一定的逻辑的任务,类似于linux的守护进程,所以为了保持持久性,恶意软件作者使用它也不足为奇。

服务由SCM(Service Control Manager)控制,它是在%SystemRoot%\System32\services.exe​.中,所有的服务都有对应的HKLM\SYSTEM\CurrentControlSet\services<service_name>​键,它包含各种各样的值来描述这个服务,比如下图。

  • ImagePath: 和相应的参数绑定的可执行文件的路径

  • Type: 服务的类型

    • 0x01(kernel) 在这种情况下,逻辑是在一个驱动程序中实现的(将在第7章“理解内核模式Rootkits”中详细介绍,该章节专门针对内核模式威胁)。
    • 0x10(own)这个服务运行在他自己的进程中
    • 0X20(share)服务运行在共享进程中
  • Start: 这世描述服务应该怎样启动的

    • 0X00(boot)和0X01(system)这些值用于驱动程序,在这种情况下,它们将分别由Boot Loader或者内核初始化期间加载。
    • 0X02(auto)该服务将在每次机器重新启动时自动启动,这是恶意软件的明显选择。
    • 0X03(demand) 指定应该手动启动的服务,这个选项对于调试特别有用。
    • 0x04 (disabled): 服务不启动。

服务被设计的几种方式

  • As an executable: 是一个executable文件,完整路径保存在ImagePath中
  • As a DLL(own loader),是一个DLL,有自己的loader(是一个自定义程序或者标准的,比如rundll32.exe) 完整的命令行保存在ImagePath中
  • As a DLL(svchost) svchost.exe加载这个DLL, 为了被加载,恶意软件在HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost​中创建新组,把它的值通过-k参数传递给svchost.exe中,ImagePath存的是svchost.exe及其 ,DLL存在HKLM\SYSTEM\CurrentControlSet\services<service_name>\Parameters​中的ServiceDll ​​中, 这个ServiceDll应该包含ServiceMain导出函数,如果使用自定义名称,则应在ServiceMain注册值中指定,如果SvchostPushServiceGlobals导出存在,它将在ServiceMain之前执行。

Attaching to services

有很多方式Attach到服务上一旦他们启动

  • 创建一个专门的注册表键,HKLM\SOFTWARE<br />Microsoft\Windows NT\CurrentVersion\Image File Execution Options<filename>​ l里面有个值是Debugger,是调试器的路径全程,一旦这个 启动时,这个Debugger就会附加上去。这里需要注意就是,如果这个服务不是interactive的话,这个Debugger可能不会出现,但是可以用以下的方法解决

    • services.msc找到该服务,然后从属性中找到这个框勾上即可。
    • HKLM\SYSTEM\CurrentControlSet\services<service_name>​中值 OR 0X100
    • sc的时候加上type= interact参数即可
  • 使用GFlags(Global Flags Editor)

  • 子进程调试

  • Patch入口点,使其无限循环,然后再Attach

需要注意的是,服务在一定时间内如果没有执行成功,可能会被KILL,有个时间限制在HKLM\SYSTEM\CurrentControlSet\\Control​中

行为分析要点

这种方法允许研究人员快速了解恶意软件的功能。然而,与之相关的局限性有很多,如下。

  • 恶意软件可能仅仅执行了它功能的一部分。
  • 恶意软件可能表现出不同的行为当他检测出自己正在被分析的时候。

在大多数情况下,行为分析工具可以很容易地通过各种特征检测到:文件、进程或目录名称、注册表键和值、互斥对象、窗口名称,等等。

现在,让我们看看最常用的工具,按类型对它们进行分组。

文件操作

Process Monitor (Filemon)

Sandboxie:这个工具的主要目的不仅仅是记录文件操作,而是让研究人员访问创建/修改的文件。如果恶意软件掉落或下载额外的模块并随后删除它们,这是非常有用的。(这个地方暂时没有明白是什么意思,我原以为只要在Sandbox中创建的文件,即使删除了也有办法恢复,但是我自己测试没有恢复。)

注册表

Process Monitor (Regmon)

Regshot

Autoruns

进程操作

Process Monitor(Procmon)

Process Explorer

WinAPIs

API Monitor

Network activity

Tcpview

Wireshark

Sandboxes

沙箱也有很多限制

  1. 沙箱不知道恶意软件执行的环境,比如需要什么命令行啥的
  2. 很容易的被检测到,恶意软件可能立刻终止或者表现出假的活动
  3. 它们的可见性是有限的,因为它们通常只显示恶意软件的一部分功能

在线沙箱服务

自管理沙箱

  • Cuckoo(Free)
  • DRAKVUF Sandbox(Free)
  • VMRay(Commercial)