写点什么

十种花式注入你身体的方法|通用性进程注入技巧大研究

用户头像
Machine Gun
关注
发布于: 2021 年 06 月 03 日
十种花式注入你身体的方法|通用性进程注入技巧大研究

前言:

进程注入是一种广泛应用于恶意软件和无文件攻击中的逃避技术,这需要在另一个进程的地址空间内运行自定义代码。进程注入提高了隐蔽性,一些技术也实现了持久性。 尽管有许多流程注入技术,在本博客中,我提供了十种在现实看到注入另一个进程运行恶意代码的技术。 我还提供了许多这些技术的屏幕截图,以便于逆向工程和恶意软件分析,协助针对这些常见技术进行检测和防御。

1. 经典的 DLL 注入方式:通过 CREATEREMOTETHREAD 和 LOADLIBRARY 进行注入

这种技术是用于将恶意软件注入另一个进程的最常用技术之一。 恶意软件将路径写入到其他进程的虚拟地址空间中的恶意动态链接库(DLL),并通过在目标进程中创建远程线程来确保远程进程加载它。



图 1

恶意软件首先需要定位注入的进程(例如 svchost.exe)。这通常通过调用三个应用程序接口(API)来搜索进程:CreateToolhelp32Snapshot,Process32First 和 Process32Next。CreateToolhelp32Snapshot 是用于枚举指定进程或所有进程的堆或模块状态的 API,它返回一个快照。

Process32First 检索快照中有关第一个进程的信息,然后在循环中使 Process32Next 来遍历它们。

找到目标进程后,恶意软件通过调用 OpenProcess 获取目标进程的句柄。

如图 2 所示,恶意软件调用 VirtualAllocEx 有一段空间来写入其 DLL 的路径。

恶意软件然后调用 WriteProcessMemory 写入分配的内存中的路径。最后,为了让代码在另一个进程中执行,恶意软件调用 API,如 CreateRemoteThread,NtCreateThreadEx 或 RtlCreateUserThread,后两者是为文档化的函数。

然而,一般的想法是将 LoadLibrary 的地址传递给这些 API 之一,以便远程进程必须代表恶意软件执行 DLL。CreateRemoteThread 被许多安全产品跟踪和标记。此外,它会在磁盘上的留下恶意 DLL 文件。考虑到攻击者注入代码的目的一般是防御,所以复杂的攻击者可能不会使用这种方法。下面的截图显示了一个名为 Rebhip 的恶意软件便是利用了这种注入技巧。



图 2 Rebhip 蠕虫使用了经典的 DLL 注入方式

2. PE 文件注入

恶意软件不会传递 LoadLibrary 的地址,而是将其恶意代码复制到现有的打开进程中,并使其执行(通过一个小的 shellcode 或通过调用 CreateRemoteThread)。PE 注入相比于 LoadLibrary 进行注入的一个优点是恶意软件不必在磁盘上释放恶意 DLL。类似于第一种注入技术,恶意软件在主机进程(例如 VirtualAllocEx)中分配内存,而不是写入“DLL 路径”,它通过调用 WriteProcessMemory 写入其恶意代码。然而,使用这种方法的缺陷是更改了复制映像的基址。当恶意软件将其 PE 注入另一个进程时,它将具有不可预测的新基址,所以要求它动态地重新计算其 PE 的固定地址。为了克服这一点,恶意软件需要在主机进程中找到其重定位表地址,并通过循环遍历其重定位描述符来解析复制的映像的绝对地址。



图 3

这种技术类似于其他技术,如反射式 DLL 注入和内存模块加载,因为它们不会将任何文件释放到磁盘。然而,内存模块加载和反射式 DLL 注入方法甚至更加隐蔽。它们不依赖任何额外的 Windows

API(例如,CreateRemoteThread 或 LoadLibrary),因为它们在内存中加载并执行自身。反射式 DLL 注入通过创建一个 DLL,在执行时将自身映射到内存中,而不依赖于 Window 的加载器。内存模块加载类似于反射式 DLL 注入,注射器或加载器负责将目标 DLL 映射到内存而不是 DLL 映射本身。在之前的一篇博文中,这两种内存方法被广泛讨论。

在分析 PE 注入时,在调用 CreateRemoteThread 之前,看到循环(通常是两个“for”循环,一个嵌套在另一个循环中)是很常见的情况。这种技术在 crypter(加密和模糊恶意软件的软件)中非常受欢迎。在图 4 中,样本使用的便是这种技术。该代码有两个嵌套循环来调整其重定位表,可以在调用 WriteProcessMemory 和 CreateRemoteThread 之前看到它。 “and

0x0fff”指令也是另一个很好的标志,显示前 12 位用于获取到包含重定位块的虚拟地址的偏移量。现在,恶意软件已经重新计算了所有必需的地址,所有它需要做的是将其起始地址传递给 CreateRemoteThread 并将其执行。



图 4 在调用 CreateRemoteThread 之前,PE 注入的循环结构示例

3. 进程 HOLLOWING (又名进程替换和 RUNPE)

恶意软件可以执行被称为进程 hollowing 的技术,而不是将代码注入宿主程序(例如,DLL 注入)。进程 hollowing 发生于恶意软件从目标进程的内存中清空(镂空)合法代码并用恶意可执行文件覆盖目标进程的内存空间(如,svchost.exe)之时。



图 5

恶意软件首先创建一个新进程,以挂起模式托管恶意代码。如图 6 所示,该程序通过调用 CreateProcess 并将流程创建标志设置为 CREATE_SUSPENDED(0x00000004)完成。新进程的主线程被创建为挂起状态,直到 ResumeThread 函数被调用才会运行。接下来,恶意软件需要用恶意的有效载荷来替换合法文件的内容。这可以通过调用 ZwUnmapViewOfSection 或 NtUnmapViewOfSection 来取消映射目标进程的内存。这两个 API 基本上释放了一个部分指向的所有内存。现在内存被取消映射,加载器执行 VirtualAllocEx 为恶意软件分配新内存,并使用 WriteProcessMemory 将每个恶意软件的部分写入目标进程空间。恶意软件调用 SetThreadContext 将 entrypoint 指向已编写的新代码段。最后,恶意软件通过调用 ResumeThread 来恢复挂起的线程。



图 6 Ransom.Cryak 实现进程 hollowing

4. 线程执行劫持 (又名:挂起,注入,恢复 (SIR))

这种技术与先前讨论的进程 hollowing 技术有一些相似之处。在线程执行劫持中,恶意软件针对进程的现有线程,并避免任何嘈杂的进程或线程的创建操作。因此,在分析期间,您可能会看到对 CreateToolhelp32Snapshot 和 Thread32First 的调用,后跟 OpenThread。



图 7

在获取目标线程的句柄后,恶意软件通过调用 SuspendThread 来将线程置于挂起模式,最终执行注入。恶意软件调用 VirtualAllocEx 和 WriteProcessMemory 来分配内存并执行代码注入的操作。

该代码可以包含 shellcode,恶意 DLL 的路径和 LoadLibrary 的地址。

图 8 给出了使用这种技术的通用木马程序。

为了劫持线程的执行,恶意软件通过调用 SetThreadContext 修改目标线程的 EIP 寄存器(包含下一条指令的地址)。之后恶意软件恢复线程来执行它已写入主机进程的 shellcode。

从攻击者的角度来看,SIR 方法可能是有问题的,因为在系统调用中暂停和恢复线程可能导致系统崩溃。为避免这种情况,更加复杂的恶意软件如果遇到 EIP 寄存器在 NTDLL.dll 的范围内的情况,将会恢复然后重试。



图 8 一般的木马正在执行线程执行劫持

5. 通过 SETWINDOWSHOOKEX 进行 HOOK 注入

Hooking 是一种用于拦截函数调用的技术。恶意软件可以利用挂钩函数,在特定线程触发事件时加载其恶意 DLL。这项技术通常通过调 SetWindowsHookEx 函数来将钩子例程安装到钩子链中来完成。

SetWindowsHookEx 函数有四个参数。第一个参数是事件的类型。这些事件反映了钩子类型的范围,并且从键盘上的键(WH_KEYBOARD)到输入到鼠标(WH_MOUSE),CBT 等的不同。第二个参数是指向恶意软件想要在事件中调用的函数的指针执行。第三个参数是包含该函数的模块。因此,在调用 SetWindowsHookEx 之前,看到对 LoadLibrary 和 GetProcAddress 的调用是非常常见的。该函数的最后一个参数是挂钩过程与之关联的线程。如果此值设置为零,则所有线程在触发事件时执行操作。然而,恶意软件通常针对一个线程来减少干扰,因此也可以在 SetWindowsHookEx 之前查看调用 CreateToolhelp32Snapshot 和 Thread32Next 来查找和定位单个线程。一旦 DLL 被注入,恶意软件代表其线程 id 被传递给 SetWindowsHookEx 函数的进程执行其恶意代码。在图 9 中,LockyRansomware 实现了这种技术。



图 9 Locky Ransomware 的 hook 注入过程

6. 通过修改注册表进行注入以及维持注入 (例如 APPINIT_DLLS, APPCERTDLLS, IFEO)

恶意软件可以使用 Appinit_DLL, AppCertDlls, 以及 IFEO (映像劫持)这三个注册表项可以用于注入和维持注入,这三个注册表项具体的位置如下:

 

AppInit_DLLs

恶意软件可以将其恶意 dll 文件的位置插入到 Appinit_Dlls 注册表项下,以使其他进程加载这个 dll 文件。

此注册表项下的每个 dll 文件都会随着 User32.dll 的加载而同样加载到进程中。User32.dll 是用于存储图形元素(如对话框)的非常常用的库。 因此,当恶意软件修改这个注册表子项时,大多数进程都将加载恶意 dll 文件。

图 10 显示了木乃伊依赖这种技术进行注入和维持注入的方法。它只需打开 Appinit_Dlls 注册表项,方法是调用 RegCreateKeyEx,并通过调用 RegSetValueEx 来修改它的值。



图 10 Ginwui 修改 AppIniti_DLLs 注册表项

AppCertDlls

这种方法与 AppInit_DLLs 方法非常相似,只是将此注册表项下的 DLL 加载到调用 CreateProcess,CreateProcessAsUser,CreateProcessWithLogonW,CreateProcessWithTokenW 和 WinExec 的每个进程中。

映像劫持 (IFEO)

IFEO 通常用于调试目的。开发人员可以在此注册表项下设置“调试器值”,将程序附加到另一个可执行文件进行调试。因此,每当启动可执行文件时,将附加到该程序。 要使用此功能,您可以简单地给出调试器的路径,并将其附加到要分析的可执行文件。恶意软件可以修改此注册表项以将其注入到目标可执行文件中。 在图 11 中,Diztakun 木马通过修改任务管理器的调试器值来实现此技术。



图 11 : Diztakun 木马修改 IFEO 注册表项

7. APC 注入以及 AtomBombing 内存注入

恶意软件可以利用异步过程调用(APC)控制另一个线程通过将其附加到目标线程的 APC 队列来执行其自定义代码。

每个线程都有一个 APC 队列,它们在目标线程进入可警醒状态时等待执行。如果调用 SleepEx,SignalObjectAndWait,MsgWaitForMultipleObjectsEx,WaitForMultipleObjectsEx 或 WaitForSingleObjectEx 函数,线程将进入可警醒状态。

恶意软件通常会查找处于可警醒状态的任何线程,然后调用 OpenThread 和 QueueUserAPC 将 APC 排队到线程。QueueUserAPC 有三个参数:1)目标线程的句柄;2)指向恶意软件想要运行的函数指针; 3)和传递给函数指针的参数。在图 12 中,Amanahe 恶意软件首先调用 OpenThread 来获取另一个线程的句柄,然后使用 LoadLibraryA 调用 QueueUserAPC 作为函数指针,将其恶意 DLL 注入另一个线程的 APC 队列中。

AtomBombing 是一种首先由 enSilo 研究引入的技术,然后用于 Dridex V4。 正如我们在前一篇文章中详细讨论的[译者注:链接见文末],该技术也是依赖 APC 注射。 但是,它是使用 atom 表写入另一个进程的内存。



图 12: Almanahe 执行 APC 注入

8. 通过 SETWINDOWLONG 进行窗口内存注入 (EWMI)

EWMI 依靠注入资源管理器托盘窗口的额外窗口内存,并在恶意软件家族中被多次使用使用,如 Gapz 和 PowerLoader。在注册窗口类时,应用程序可以指定一些额外的内存字节,称为额外的窗口存储器(EWM)。

然而,EWM 并不算是块很充裕的空间。

为了规避这个限制,恶意软件将代码写入 explorer.exe 的共享部分,并使用 SetWindowLong 和 SendNotifyMessage 来指定一个指向 shellcode 的函数指针,然后执行它。



图 13 PowerLoader 注入托盘窗口的额外窗口内存

当涉及到向共享部分的写入数据时,恶意软件有两个选择:它可以也创建一个共享空间,并将其映射到自身和另一个进程(例如,explorer.exe);第二个选择就是简单地打开已经存在的共享部分。

前者具有分配堆空间和调用 NTMapViewOfSection 以及其他一些 API 调用的开销,因此后一种方法被更频繁地使用。

恶意软件在共享部分中写入其 shellcode 后,使用 GetWindowLong 和 SetWindowLong 访问并修改“Shell_TrayWnd”的额外窗口内存。

GetWindowLong 是用于将指定偏移量的 32 位值检索到窗口类对象的额外窗口存储器中的 API,SetWindowLong 用于更改指定偏移量的值。通过这样做,恶意软件可以简单地更改窗口类中的函数指针的偏移量,并将其指向写入共享部分的 shellcode。

像上面提到的大多数其他技术一样,恶意软件需要触发它编写的代码。

在以前讨论的技术中,恶意软件通过调用 API(如 CreateRemoteThread,QueueUserAPC 或 SetThreadContext)来实现这一点。

在 EWMI 方法中,恶意软件通过调用 SendNotifyMessage 触发注入的代码。在执行 SendNotifyMessage 之后,Shell_TrayWnd 接收并将控件传递给由 SetWindowLong 先前设置的值指向的地址。

在图 13 中,名为 PowerLoader 的恶意软件使用这种技术。

9. SHIMS 注入

Microsoft 向开发人员提供了Shims[译者注:Shim 是一个工程术语,描述为了让两个物体更好地组装在一起而插入的一块木头或金属。在计算机编程中,shim 是一个小型的函数库,用于透明地拦截 API 调用,修改传递的参数、自身处理操作、或把操作重定向到其他地方。Shim 也可以用来在不同的软件平台上运行程序。],主要是为了向后兼容。

Shims 允许开发人员将修补程序应用于程序,而无需重写代码。 通过利用 Shims,开发人员可以告诉操作系统如何处理其应用程序。

Shims 本质上是一种嵌入 API 并针对特定可执行文件的方式。 恶意软件可以利用 Shims 来实现注入可执行文件并维持注入。

Windows 运行 Shim 引擎时,它加载二进制文件以检查 shimming 数据库,以便应用适当的修补程序。

有许多可以使用的修复程序,但是恶意软件还是更偏爱那些安全相关的(例如 DisableNX,DisableSEH,InjectDLL 等)。要安装 shimming 数据库,恶意软件可以使用各种方法。

例如,一个常见的方法是简单执行 sdbinst.exe,并将其指向恶意的 sdb 文件。 在图 14 中,广告软件“Search Protect by Conduit”使用 Shims 进行注入和维持。 它在 GoogleChrome 中执行“InjectDLL”shim 以加载 vc32loader.dll。

现在有一些用于分析 sdb 文件的工具,但是对于下面列出的 sdb 的分析,我使用了 python-sdb,而没有使用现成的工具。



图 14 Search Protect 用于注入的 SDB

10. IAT HOOKING 和 INLINE HOOKING (又名应用层 ROOTKITS)

IAT hooking 以及 inline hooking 通常被称为用户级 rootkit. 恶意软件可以利用 IAT HOOKING 技术更改导入地址表。

当合法应用程序调用位于 DLL 中的 API 时,将执行替换的函数,而不是原始代码。 相比之下,使用 Inline Hooking,恶意软件可以修改 API 函数本身。 在图 15 中,恶意软件 FinFisher 通过修改 CreateWindowEx 指向的位置执行 IAT HOOKING。



图 15 FinFisher 通过更改 CreateWindowEx 指向的位置实现 IAT HOOKING

看到这里的大佬,动动发财的小手 点赞 + 回复 + 收藏,能【 关注 】一波就更好了

为了感谢读者们,我想把我收藏的一些网络安全/渗透测试学习干货贡献给大家,回馈每一个读者,希望能帮到你们。

干货主要有:

① 2000 多本网安必看电子书(主流和经典的书籍应该都有了)

② PHP 标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ 网络安全基础入门、Linux 运维,web 安全、渗透测试方面的视频(适合小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ 渗透测试工具大全

⑦ 2021 网络安全/Web 安全/渗透测试工程师面试手册大全

各位朋友们可以关注+评论一波 然后扫描下方二维码  备注:csdn  即可免费获取全部资料



总结

在这篇文章中,我介绍了恶意软件在另一个进程中隐藏其活动的十种不同技术。通常,恶意软件直接将其 shellcode 注入到另一个进程中,或者强制另一个进程加载其恶意 DLL。在表 1 中,我对各种技术进行了分类,并提供了样品,作为观察本文所涵盖的每种注射技术的参考。整篇文章中的数字将有助于研究人员在反转恶意软件时识别各种技术。



表格 1: 流程注入可以通过直接将代码注入到另一个进程中,或通过强制将 DLL 加载到另一个进程来完成

攻击者和研究人员经常发现新的技术来实现注入并提供隐藏自身的目的。这篇文章详细介绍了十种常见和新兴的技术,但还有其他的没有提及,如 COMM 劫持。 防御者在其使命中将永远不会“完成”检测和防止隐形进程注入的任务,因为入侵者永远不会停止创新。

在 EndGame[译者注:原文发表的网站名称为 EndGame],我们不断研究先进的隐藏技术,并将这些技术带入我们的产品中,给产品提供保护。我们的层级功能可以检测加载某些维持注入(如 AppInit DLL,COM Hijack 等)的恶意 DLL,通过我们的 shellcode 注入防护软件,可以实时防止许多形式的代码注入,并且可以检测在内存中运行的恶意注入的有效负载。我们正在申请专利的无文件攻击检测技术可以让我们的平台比市场上任何其他产品更有效地防止代码注入,同时还通过新兴的代码注入技术最大限度地提高绕过的弹性。

用户头像

Machine Gun

关注

还未添加个人签名 2021.03.28 加入

需要获取网络安全/渗透测试学习资料工具的朋友可联系V:machinegunjoe666 免费索取

评论

发布
暂无评论
十种花式注入你身体的方法|通用性进程注入技巧大研究