导语:Early Bird代码注入技术允许注入的代码中进程的主线程入口点之前运行,因此反恶意软件产品可能检测不到。

代码注入恶意软件是避免被检测到的一种常用技术,是向合法进程中注入代码。这样,合法的进程就会成为恶意代码的伪装,反恶意软件产品看到运行的是一个合法的进程,这样就可以达到混淆恶意代码的目的。

研究人员对一种新的代码注入技术进行了研究,它允许恶意代码中进程的主线程入口点之前就运行,所以如果安全产品的hook放在主函数线程执行复原前,这种注入就可以绕过安全产品的检测。但是在线程代码执行前,异步过程调用会首先执行。

研究人员在不同的恶意软件中都发现了这种注入技术的踪迹,包括APT 33的后门TurnedUp。

恶意代码注入工作流如下:

· 创建一个处于suspend状态的(合法Windows)进程;

· 向该进程中分配和写入恶意代码;

· 给该进程安排一个异步过程调用的排队;

· 继续进程的主线程来执行异步过程调用。

Hooks是进程开始执行后合法的反恶意软件产品插入的代码块,位于特定的Windows API调用。Hooks的目标是监控API调用的参数来找出恶意调用和调用模式。

下面讲述一下异步过程调用在暂停进程恢复的过程中的执行流程。

代码注入技术如图:

127417192.jpg

Early bird代码注入技术分析

在分析样本时,研究人员发现一个恶意软件样本(SHA256:9173b5a1c2ca928dfa821fb1502470c7f13b66ac2a1638361fda141b4547b792)

该.net样本首先逆混淆自己,然后执行process hollowing然后用本地Windows图片来过滤hollowed process。本地的Windows图片就会注入到explorer.exe进程中。explorer.exe中的payload会创建一个suspended状态的进程svchost.exe,然后注入。该样本含有三种不同的注入方法。svchost.exe 中的payload的SHA256值是c54b92a86c9051172954fd64573dd1b9a5e950d3ebc581d02c8213c01bd6bf14。截止2018年3月20日,只有29家安全厂商的反恶意软件对该payload进行了签名。

因为process hollowing和explorer.exe注入没有什么价值,所以研究人员重点关注第三个技术。我们看一下在注入到svchost.exe之前都调试器内都发生了什么。

图1 创建的suspended状态的svchost.exe进程

恶意软件创建了一个suspended状态的svchost.exe进程,常见的合法Windows进程是恶意软件的最爱,svchost.exe是提供服务的Windows进程。

在创建了该进程后,恶意软件会向其分配内存然后在分配的内存区域中写入代码。为了执行注入的代码,需要在svchost.exe的主线程中调用NtQueueApcThread来进行异步过程调用的排队。然后调用NtResumeThread来减少线程的suspend数量到0。然后svchost.exe的主线程会恢复执行,如果线程处于紧急状态,那么APC就会首先执行。

 

图2 在svchost.exe的主线程中加入APC排队并恢复线程执行

当排队的APC到线程后,线程首先要执行状态为紧急的APC来执行。

如果进程是在suspended状态创建的,而进程并没有开始执行怎么办?恶意软件如何知道线程在哪个点上紧急状态呢?这种方法只应用于svchost.exe还是在所有suspended状态下创建的进程都是使用的?

为了回答这几个问题,研究人员对恶意软件进行了修补,这样恶意软件就可以注入到研究人员选择的其他进程了,然后进行观察。

在NtQueueApcThread的调用中设置断点,可以看到svchost.exe的APC地址为0x00062f5b。在调试器中将断点地址设为0x00062f5b,下面是在0x000625fb处的svchost.exe进程:

图3  svchost.exe中APC开始执行点

下面看一下线程恢复执行后的调用栈,断点在0x00062f5b :

图4 svchost.exe的调用栈

首先要说明每个用户模式的线程都是以LdrInitializeThunk函数开始执行的。在调用栈的底部可以看到LdrpInitialize被调用了,LdrInitialize是通过LdrInitializeThunk调用的(图5)。研究人员追踪了LdrpInitialize,发现跳转到了函数_LdrpInitialize (图6)。在_LdrpInitialize内部,可以看到对NtTestAlert函数的调用 (图7),该函数是负责检查当前线程有没有异步过程调用排队,如果有,就通知内核。在返回用户模式前,内核会让用户模式进程跳转到KiUserApcDispatcher,在本例中KiUserApcDispatcher会执行恶意代码。

图5 0x76e539c1 LdrpInitialize调用后的地址

图6 LdrpInitialize内部有到_LdrpInitialize的跳转

1963030564.jpg

图7 _LdrpInitialize内部有对NtTestAlert的调用

有证据显示异步过程调用是KiUserApcDispatcher执行的(图8),再看一次调用栈,我们发现0x00062f5b的返回地址是0x76e36f9d,刚好是KiUserApcDispatcher的调用。

图8 KiUserApcDispatcher执行异步过程调用

总结一下,导致异步过程调用执行的执行流为:

LdrInitializeThunk → LdrpInitialize → _LdrpInitialize → NtTestAlert → KiUserApcDispatcher

非常重要的一点就是该注入方法是在线程初始化的早期阶段加载恶意代码,加载恶意代码在安全产品放置hook之前,所以恶意软件可以绕过安全产品的检测。

研究人员还发现使用这种技术的其他样本 (SHA 256):

· 165c6f0b229ef3c752bb727b4ea99d2b1f8074bbb45125fbd7d887cba44e5fa8

· 368b09f790860e6bb475b684258ef215193e6f4e91326d73fd3ab3f240aedddb

· a82c9123c12957ef853f22cbdf6656194956620d486a4b37f5d2767f8d33dc4d

· d17dce48fbe81eddf296466c7c5bb9e22c39183ee9828c1777015c1652919c30

· 5e4a563df904b1981d610e772effcb005a2fd9f40e569b65314cef37ba0cf0c7

最后的这两个样本数最近发现的,是伊朗黑客组织APT33写的后门软件“TurnedUp”。图9是最后一个样本的截图,该样本展示了向rundll32.exe注入的过程中使用了本技术,rundll32.exe是一个合法的Windows进程,用来从dll文件运行输出函数。

图9  创建的suspended状态的rundll32.exe进程,然后使用QueueUserApc注入

在本样本中,异步调用过程是用来维持系统的驻留。图10中可以看到rundll32.exe中异步过程调用的开始(0x90000)。进一步分析就会发现,恶意软件会向Windows注册表中写入一个key来确保驻留(图11),cmd命令为:

 “/c REG ADD HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v RESTART_STICKY_NOTESS /f /t REG_SZ /d \”C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\StikyNote.exe\”“\

ShellExecuteA如果位于APC调用之后,Early Bird调用和参数会在hook前躲过检测。

图10 rundll32.exe处异步过程调用开始执行

278829244.jpg

图11 调用ShellExecuteA

源链接

Hacking more

...