远程线程注入什么意思 远程线程注入案例

译者:myswsun预计稿费:300元提交方式:发送邮件至林微#360.cn,或登录网页在线提交。0x00前言进程注入是恶意软件和无文件攻击中广泛使用的一种规避技术,这意味着自定义代码可以在另一个进程的地址空中运行。进程注入提高了隐蔽性,也实现了持久性。虽然进程注入技术有很多,但...

译者:myswsun

预计稿费:300元

提交方式:发送邮件至林微#360.cn,或登录网页在线提交。

0x00前言

进程注入是恶意软件和无文件攻击中广泛使用的一种规避技术,这意味着自定义代码可以在另一个进程的地址空中运行。进程注入提高了隐蔽性,也实现了持久性。虽然进程注入技术有很多,但我在本文中只列举了10种常见的技术。我还提供这些技术的截图,用于反向和恶意软件分析,并帮助捍卫这些技术。

0x01是通过CreateRemoteThread和LoadLibrary的DLL注入的。

这是过程注入最常见的技术。恶意软件将恶意动态链接库的路径写入另一个进程的虚拟地址空,通过在目标进程中创建远程线程来确保远程进程加载。

恶意软件首先需要选择一个目标进程(比如svchost.exe)。一般使用API: create toolhelp32snapshot、process32first、Process32Next。CreateToolhelp32Snapshot是一种用于枚举指定进程或所有进程的堆或模块的状态,它返回一个快照。process 32首先获取快照中第一个进程的信息,然后Process32Next遍历所有进程。找到目标进程后,恶意软件调用OpenProcess获取目标进程的句柄。

如上图所示,恶意软件调用VirtualAllocEx获取写路径的memory 空。然后调用WriteProcessMemory在分配的内存中写入路径(动态链接库)。最后调用API(如CreateRemoteThread、NtCreateThreadEx、RtlCreateUserThread)让另一个进程执行代码。后两个API没有文档记录。但是,一般的想法是将LoadLibrary的地址传递到这些API中的一个,以便远程进程可以执行DLL。

CreateRemoteThread被很多安全产品跟踪和标记。此外,它会在磁盘上留下一个恶意DLL以供检测。考虑到攻击者注入代码最常见的目的是逃避防御,聪明的攻击者不会使用这种方法。以下名为rebhip的恶意软件(sha 256:
07 b 8 f 25 e 7 b 536 F6 f 6 f 686 c 12d 04 EDC 37 e 11347 c 8 CAC 5 c 53 f 98 a 174723078 c 365)已经使用了该技术。

0x02可执行文件注入(PE注入)

恶意软件不会传入LoadLibrary的地址,而是将恶意代码***到打开的进程中并执行(通过短外壳代码或调用CreateRemoteThread)。与LoadLibrary相比,PE注入的优势在于恶意软件不需要在磁盘中释放一个恶意DLL。与前面的技术类似,恶意软件在目标进程中分配内存,调用WriteProcessMemory将恶意代码写入内存,而不是DLL路径。但是,这种方法的缺点是改变了***图像的基地址。当一个恶意软件在另一个进程中注入PE时,其新的基址是不可预测的,PE的地址需要动态重新计算。为此,恶意软件需要找到目标进程的重定位表,并根据其重定位描述解析***映像的绝对地址。

这种技术类似于其他技术,如反射DLL注入和内存模块加载,因为它们不将任何文件释放到磁盘。但是,内存模块和反射DLL注入更加微妙。它们不依赖于Windows API(如CreateRemoteThread或LoadLibrary),因为它们在内存中加载和执行自己。DLL的反射注入是通过在内存中创建DLL映射来执行的,不依赖于Windows的加载程序。内存加载类似于反射DLL注入,只是内存模块加载的注入器或加载器负责将目标DLL映射到内存中,而不是DLL映射本身。在以前的博客文章中,讨论了这两种技术。

在分析PE注入时,通常可以在调用CreateRemoteThread之前看到循环(通常是两个for循环,一个嵌套在另一个中)。这项技术在crypter(加密和混淆软件)中非常流行。下图的例子(sha 256:
ce 8d 7590182 db 2 e 51372 a 4a 04 d6a 0927 a 65b 2***0739 f 9 EC 01 CDF 6 c 143 b 110 da)就充分利用了这种技术。在调用WriteProcessMemory和CreateRemoteThread之前,有两层循环来处理重定位。“and 0x0fff”指令也是一个很好的表示,它指示用于获取包含重定位块的虚拟地址的前12位的偏移量。现在恶意软件已经重新计算了所有需要的地址,它只需要将起始地址传递给CreateRemoteThread并执行它。

0x03进程中空(也称为进程替换和RunPE)

恶意软件有一种技术叫process hollow,而不是把代码注入到程序中(比如DLL注入)。当恶意软件取消映射目标进程的合法内存代码,并用恶意代码覆盖目标进程(如svchost.exe)的内存时,就会出现进程空洞。

恶意软件首先在挂起模式下创建一个新进程来容纳恶意代码。如下图(sha 256:
EAE 72d 803 BF 67 df 22526 f 50 f 7 ab 84d 838 efb 2865 c 27 ef 161592 B1 c520d 144)调用CreateProcess,参数为CREATE_SUSPENDED (0x00000004)。新进程的主线程在创建后被挂起,在调用ResumeThread之前不会继续执行。接下来,恶意软件需要使用恶意有效载荷来填充合法文件的内容。调用ZwUn***pViewOfSection或NtUn***pViewOfSection取消目标进程的内存映射。这两个API将释放section所指向的所有内存。取消映射后,使用WriteProcessMemory将恶意软件部分写入目标进程。调用SetThreadContext将入口点指向它所编写的新代码段。最后,调用ResumeThread继续执行挂起的进程。

0x04线程执行劫持(也称为挂起、注入和恢复)

这种技术类似于空心工艺。在线程执行劫持中,恶意软件的目标是进程中的现有线程,没有创建任何进程或线程。因此,在分析过程中,您可能会看到CreateToolhelp32Snapshot和Thread32First,OpenThread。

在获得目标线程的句柄后,恶意软件调用SuspendThread来挂起该线程。调用VirtualAllocEx和WriteProcessMemory来分配内存和执行代码注入。代码包含shellcode、恶意DLL的路径和LoadLibrary的地址。

下图(sha 256:
787 CB 8 c 8 a 611 BC 58 ea 169 e 51 E1 ad 029 a 637 f 22560660 cc 129 ab 8 a 099 a 745 BD 50 e)描述了一个普通的木马是如何使用这种技术的。为了劫持线程的执行,恶意软件调用SetThreadContext修改目标线程的EIP寄存器(该寄存器包含下一条执行指令的地址)。然后,恶意软件恢复线程继续执行它已经写入主机进程的外壳代码。从攻击者的角度来看,这种方法是有问题的,因为在系统调用过程中挂起和恢复线程可能会导致系统崩溃。为了避免这种情况,一种更复杂的利用技术是,一旦EIP寄存器位于NTDLL.dll中,就恢复并重试它。

0x05通过SetWindowsHookEx挂钩注入

钩子是一种用来拦截函数调用的技术。恶意软件可以通过使用指定线程中的事件触发器来加载他们的恶意DLL。通常,SetWindowsHookEx用于安装消息挂钩。SetWindowsHookEx有4个参数。第一个参数是事件的类型。有许多类型的事件,如键盘按键(WH _键盘)和鼠标输入(WH _鼠标)。第二个参数是一个函数指针,指向恶意软件想要处理事件的函数。第三个参数是包含函数的模块。所以通常可以看到LoadLibrary,GetProcAddress,SetWindowsHookEx。最后一个参数是与消息挂钩相关联的线程。如果该值为0,则适用于所有线程。然而,只有一个线程的目标会小得多,所以您可能还会看到CreateToolhelp32Snapshot和Thread32Next。一旦DLL被注入,恶意软件就会执行恶意代码。如下图,勒索软件Locky(sha 256:

5d 6 DDB 8458 e E5 a 99 e 7a 21490 ff 4 e 5c 9808 e 18 b 9 e 20 b 6 DC 25 b 27927 ba 1)就采用了这种技术。

0x06通过注册表修改(如AppInit _ DLLs、AppCertDlls、IFEO)

Appinit_DLL,AppCertDlls,IFEO(镜像劫持)可用于注入和持久化。的完整路径如下所示:

AppInit _ DLLs

恶意软件可以在AppInit _ DLLs项下插入恶意DLL的路径,以便其他进程可以加载它。该项下的每个DLL将被加载到所有加载User32.dll的进程中。User32.dll是一个基于Windows的公共库。因此,当恶意软件修改该子项时,会有大量进程加载恶意dll。下图木马Ginwui(sha 256:
9 F10 EC 2786 a 10971 eddc 919 a5 e87a 927 c 652 e 1655 ddbbae 72d 376856d 30 fa 27 c)依靠的就是这种技术。它通过调用RegCreateKeyEx打开AppInit _ DLLs项,并通过调用RegSetValueEx修改它。

AppCertDlls

此方法类似于AppInit _ DLLs,只是该项下的DLL将加载到调用Win32 API CreateProcess、CreateProcessAsuser、CreateProcessWithLogonW、CreateProcessWithTokenW和WinExec的进程中。

映像劫持

O IFEO通常用于调试。开发人员可以在此项下设置调试器来附加调试。因此,当可执行文件启动时,附加到它的程序也会启动。要使用这个函数,您可以简单地设置调试器的路径,并将其附加到您想要分析的可执行文件。下图中木马Diztakun(sha 256:
f 0089056 fc 6a 314713077273 c 5910 f 87813 fa 750 f 801 DFC A4AE 7e 9d 7578 a 148)使用了这种技术,它修改了任务管理器的调试器值。

0x07 APC喷射和原**爆炸

恶意软件使用异步过程调用(APC)来强制另一个线程执行附加到APC队列的自定义代码。每个线程都有一个APC队列,当线程进入变量状态时可以执行(编者注:英文原文中有一处疑似拼写错误,两处使用了单词altable state,一处使用了alertable state,疑似为可变状态)。当您调用Sleepex、SignalObjectAndWait、

msgWAITFORMULTIPLEO***ECTSex、WaitFormULIPLEO***ECTSex、WaitForSingleObjectEX时,您会进入一个变量状态。恶意软件通常会查询线程是否处于可变状态,然后调用OpenThread和QueueUserAPC将APC插入线程。QueueUserAPC有3个参数:1。目标线程2的句柄。恶意软件想要执行的函数的指针3。传递给函数的参数。如下图,恶意软件A***nahe(sha 256:f 74399 cc 0 be 275376 dad 23151 e 3d 0 C2 a 1c 966 e 6 db 695 a 05 C1 a 30551 c0ad)首先调用OpenThread获取另一个线程的句柄,然后调用QueueUserAPC注入以LoadLibrary为函数指针的恶意DLL。

AtomBombing最早由enSilo提出,然后在Dridex V4中使用。如前一篇博文中所讨论的,这种技术也依赖于APC注入。但是,它使用atom表写入另一个进程的内存。

0x08通过SetWindowLong (EWMI)注入窗口存储器

EWMI依赖项被注入到资源管理器托盘的窗口内存中,并在恶意软件家族Gapz和PowerLoader中多次使用。注册窗口类时,应用程序可以指定额外的内存字节,这被称为额外窗口内存(EWM)。然而,在EWM没有很多空房间。为规避这一限制,恶意软件将代码写入explorer.exe的共享段,并使用SetWindowLong和SendNotifyMessage获取指向shellcode的函数指针,然后执行。

当写入共享段时,恶意软件有两种选择。它可以创建一个共享段并将其映射到另一个进程(如explorer),或者打开一个现有的共享段。前者有分配堆内存的开销,还调用NtMapViewOfSection等API,所以后者更常用。恶意软件将Shell代码写入共享段后,使用GetWindowLong和SetWindowLong访问修改Shell_TrayWnd多余的窗口内存。GetWindowLong用于在window类对象中通过使用32位值作为偏移量来获得额外的窗口内存,而使用SetWindowLong可以改变指定偏移量的值。通过这样做,恶意软件可以改变窗口类中的函数指针,并将其指向共享段的外壳代码。

与上述技术一样,恶意软件需要触发编写的代码。之前是通过调用CreateRemoteThread、SetThreadContext、QueueUserAPC等API来实现的。与之前不同的是,这项技术通过使用SendNotifyMessage来触发代码执行。

一旦SendNotifyMessage被执行,Shell_TrayWnd将接收并把控制权交给SetWindowLong设置的地址。下图中,名为Power Loader的恶意软件(sha 256:
5 e56a 34c 4c 304 e 6278 df 0 b 32 AFB 62D 0 DD 01 e2a 9894 ad 07 f 4 cc 5f 873 a B5CF)就采用了这种技术。

0x09 使用Shims注入0x09使用垫片注入

微软向开发者提供Shims,主要是为了向后兼容。Shims允许开发人员在不重写代码的情况下修复程序。通过垫片,开发者告诉操作系统如何处理他们的应用程序。Shims本质上是Hook API的方式。恶意软件可以被填充程序注入并持久化。加载二进制文件时,Windows运行shim引擎来检查Shim数据库,以便使用适当的修复。

有许多可用的修复程序,但恶意软件最喜欢的是一些与安全相关的修复程序(如DisableNX、DisableSEH、InjectDLL等)。).为了安装shim数据库,恶意软件已经以多种方式部署。例如,一种常见的方法是执行sdbinst.exe,并将其指向恶意的sdb文件。如下图,一款广告软件“Search Protect by Conduit”(sha 256:
6d 5048 ba F2 C3 BBA 85 ADC 9 C5 ffd 96 b 21 c 9 a 27d 76003 c 4 aa 657157978d 7437 a 20)使用shim实现持久化和注入。它执行一个“InjectDLL”填充程序将vc32loader.dll加载到谷歌浏览器中。有一些现成的工具可以分析sdb文件。下面是我使用python-sdb分析的结果。

0x0A IAT钩子和内联钩子(应用层rootkit)

IAT钩子和内联钩子通常也被称为应用层rootkit。IAT·胡克使用了一种改变导入地址表的技术。当合法程序调用位于DLL中的API时,被替换的API将被执行。相反,在inline hook中,恶意程序会自己修改API函数。如下图,恶意软件fin fisher(sha 256:

f 827 c 92 FBE 832 db 3f 09 f 47 e 0 dcaa FD 89 b40 c 70*** ab 90833 a1 f 418 f 2 D1 e 75 e 8 e),IAT钩子CreateWindowEx。

0x0B摘要

在本文中,我描述了恶意软件用来隐藏自身行为的10种不同技术。通常,恶意软件会直接将外壳代码注入到另一个进程中,或者强制其他进程加载恶意dll。如下表所示,我对不同的技术进行了分类,并提供了查看本文中提到的每种注入技术的示例。这可以帮助研究人员反向识别各种技术。

攻击者和研究人员一直在研究注射和隐藏的新技术。本文介绍了10种常见技术,但还有其他技术,如COM劫持。守卫者任重道远。

本文来自怪你过分美丽投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/635270.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 07-15
下一篇 07-15

相关推荐

  • 何不言日食之余如之初什么意思

    何不言日食之余如之初的意思是:为什么不说日食剩下的就像刚出来的月亮呢?出处:《后汉书 黄琬传》。原文是琼思其对而未知所况。琬年七岁,在旁曰:何不言日食之余如月之初?琼大惊,即以其言应诏,而深奇爱之。   何不言日食之余如之初什么意思  何不言日食之余如之初的

    2023-07-29 11:21:01
    441 0
  • 恍然大悟的意思是

    恍然大悟的“恍”是猛然的意思恍然大悟读音hung rn d w 解释恍然猛然清醒的样子悟心里明白形容一下子明白过来出自宋释道原景德传灯录卷五“简蒙指教,豁然大悟”。恍然大悟 读音hung rn d w解释恍然猛然清醒的样子悟心里明白形容一下子明白过来出处宋释道原景德传灯录卷五“薛

    2023-07-29 10:50:01
    940 0
  • eca是什么意思

    Eca其实是事件和条件以及动作的一种简称,一般是当一个策略或者是一件事情发生之后,通过监视器来捕捉度该事件,然后再根据eca作出判断,然后选择合适的行为或动作。学英语要背单词可能很多人都觉得背单词根本就不算得上是什么学习的方法,但是这是最有效的一种途径了,单词是

    2023-07-29 10:13:01
    1152 0
  • 喜不胜收什么意思

    喜不胜收的意思是:喜不自胜是一个成语,意思是指高兴得自己都觉得受不了,形容喜悦到了极点。元王实甫《西厢记》第五本第四折小生去时,承夫人亲自饯行,喜不自胜。我去的时候承夫人亲自给我饯行,高兴得不得了。看着我们的丰功伟绩,我们自是喜不自胜,更来劲了。   喜不

    2023-07-29 09:36:01
    666 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信