IcedID恶意软件原理分析(一):脱壳、挂钩和进程注入
2019-07-25 12:15:32 Author: www.4hou.com(查看原文) 阅读量:111 收藏

概述

IcedID是一种银行木马,该木马在浏览器上执行Web注入,并作为监测并操纵流量的代理。该木马能够窃取受害者的信息,例如凭据。然后,会将被窃取的信息发送到远程服务器。

最近,FortiGuard Labs团队开始对一些IcedID样本进行分析。在本系列文章中,我将详细分析新的IcedID恶意软件样本,本系列将分为三个部分。

· 第一部分:脱壳、挂钩和进程注入

· 第二部分:IcedID核心Payload分析

· 第三部分:子进程分析

本文是该系列的第一部分,让我们来逐一突破。

0x01 恶意PE可执行文件

我们所分析的样本是PE可执行文件,最常见的是受感染的Office文件。下图展现了执行PE文件后产生的进程树。我们可以看到,这个IcedID样本最终创建了一个svchost.exe父进程和三个svchost.exe子进程。此外,它还可以提供Trickbot Payload,在其中以红色突出显示。在这一系列文章中,我们不会涉及对Trickbot Payload的分析,我们只关注IcedID内部的工作原理。

执行IcedID样本后产生的进程树:

1.png

如上图所示,PE可执行文件首先使用命令行参数“-q=xxxxxxxxxx”启动其自身。随后,继续启动svchost.exe进程。在启动第一个svchost.exe进程之后,前两个进程将会退出。最后,这个svchost.exe父进程启动3个svchost.exe子进程。

0x02 解压缩PE可执行文件

接下来,我们可以开始动态分析PE执行的过程。从入口点跟踪几步后,程序进入到函数sub_00415CAE(),如下所示。

跳转到trampoline代码:

2.png

在trampoline代码中,它用于解密代码段。最终,它可以跳转到程序真正的入口点。此时,PE可执行文件的脱壳过程就已经完成。

跳转回实际入口点0x401000:

3.png

下面是程序真正入口点的伪代码:

4.png

该程序的主要功能列表如下:

1. 检查命令行参数是否以“-q=”开头。如果是,则跳转到步骤2,否则跳转到步骤3。

2. 创建svchost.exe进程,并执行进程注入。

3. 使用TSC参数(“-q=xxxxxxxxx”)创建新进程。

我们在没有任何参数的情况下运行此示例,因此可以进入到步骤3(sub_4012E9)。

函数sub_4012E9:

5.png

在执行rdtsc指令后,返回值将会被转换为字符串,并作为新进程执行的参数。接下来,程序在进程上下文中设置环境变量。变量的名称是不带前缀“-q=”的命令行参数。

在进程上下文中设置环境变量:

6.png

最后,调用CreateProcessA函数,以使用参数创建其自身。

接下来,我们继续对新运行的进程进行分析。

0x03 挂钩技术和进程注入

启动新进程后,程序进入实际入口点,如上所示。此时,check_parameter()函数返回TRUE,因为命令行参数以“-q=”开头。然后,会转到sub_40124A()函数。

sub_40124A()的伪代码:

7.png

在函数hook_NtCreateUserProcess()中,首先调用函数NtProtectVirtualMemory,将函数NtCreateUserProcess的前五个字节的保护更改为PAGE_EXECUTE_READWRITE。然后,它使用JMP指令来修改这五个字节。最后,再次调用函数NtProtectVirtualMemory将前五个字节恢复为原来的保护模式。

挂钩函数NtCreateUserProcess:

8.png

以下是函数NtCreateUserProcess的汇编代码:

9.png

在函数CreateProcessA中,代码调用低级API NtCreateUserProcess,程序转到trampoline代码sub_4010B7()。下面是trampoline代码的伪代码。

10.png

Trampoline代码实际执行的操作如下:

1. 对函数NtCreateUserProcess取消挂钩;

2. 调用函数NtCreateUserProcess,负责执行创建新进程的主要工作;

3. 使用RtlDecompressBuffer释放缓冲区;

4. 对svchost.exe执行进程注入,并在svchost.exe的进程空间中挂钩RtlExitUserProcess。

接下来,让我们具体来分析下步骤4。下面是该步骤中函数sub_401745()的伪代码,在svchost.exe中实现进程注入,并挂钩其RtlExitUserProcess:

11.png

首先,使用NtAllocateVirtualMemory在远程进程空间(svchost.exe)中分配内存区域。接下来,它使用ZwWriteVirutalMemory在svchost.exe进程中执行代码注入,注入到内存区域。

在svchost.exe进程中实现进程注入:

12.png

然后,在svchost.exe的进程空间中,为RtlExitUserProcess设置一个挂钩。需要注意的是,这里与此前挂钩RtlExitUserProcess和NtCreateUserProcess时存在一些差别。前者是挂钩远程进程空间的API,而后者是挂钩当前进程空间的API。

挂钩RtlExitUserProcess:

13.png

挂钩后的RtlExitUserProcess的汇编代码如下所示:

14.png

在此前已经创建了没有参数的svchost.exe进程。如果在没有参数的情况下运行svchost.exe,则可以立即退出,在退出后,将调用低级API RtlExitUserProcess。由于IcedID恶意软件挂钩了RtlExitUserProcess,因此它可以跳转到trampoline代码,以执行IcedID Payload。

远程进程svchost.exe中注入的内存区域如下图所示。我们可以看出,已经注入了两个内存区域。代码段存储在存储区域(0xa1000 ~ 0xa7000)之中。

Svchost.exe进程的注入内存区域:

如图14所示,它将跳转到0xA2B2D,该部分位于存储区(0xA1000 – 0xA7000)中。Trampoline代码与该存储区域的偏移量为0x2B2D。

0x03 结论

我们已经详细分析了IcedID恶意软件的脱壳、挂钩和进程注入技术,以及如何执行IcedID Payload。在下一篇文章中,我们将对IcedID Payload(0xA2B2D)进行深入分析。敬请期待!

0x04 解决方案

该恶意PE文件已经被FortiGuard反病毒服务检测为“W32/Kryptik.GTSU!tr”。

0x05 参考信息

SHA-256哈希值

PE可执行文件(b8113a604e6c190bbd8b687fd2ba7386d4d98234f5138a71bcf15f0a3c812e91)


文章来源: https://www.4hou.com/malware/19235.html
如有侵权请联系:admin#unsafe.sh