|
|
|
联系客服020-83701501

十种注入技巧 - 通用性进程注入技巧研究

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
十种注入技巧 | 通用性进程注入技巧研究

进程注入是一种普遍利用于恶意软件和无文件打击中的避让技能,这需要在另外一个进程的地点空间内运行自界说代码。进程注入提高了匿伏性,一些技能也实现了长期性。 虽然有很多流程注入技能,在本博客中,我提供了十种在实践看到注入另外一个进程运行恶意代码的技能。 我还提供了很多这些技能的屏幕截图,以便于逆向工程和恶意软件解析,帮助针对这些常见技能休止检测和防止。

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中,Locky
Ransomware实现了这种技能。

图 9 Locky Ransomware 的hook注入过程

6. 经过修正注册表休止注入以及维持注入 (比如APPINIT_DLLS, APPCERTDLLS, IFEO)

恶意软件或许垄断Appinit_DLL, AppCertDlls, 以及 IFEO (映像挟制)这三个注册表项或许用于注入和维持注入,这三个注册表项详细的地位如下:

1  

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休止注入和维持。 它在Google
Chrome中实验“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

总结

在这篇文章中,我引见了恶意软件在另外一个进程中隐藏其勾当的十种差别技能。
群体,恶意软件间接将其shellcode注入到另外一个进程中,大概强迫另外一个进程加载其恶意DLL。
在表1中,我对各类技能休止了分类,并提供了样品,作为观察本文所涵盖的每种注射技能的参考。
整篇文章中的数字将有助于研究人员在反转恶意软件时识别各类技能。

表格1: 流程注入或许经过间接将代码注入到另外一个进程中,或经过强迫将DLL加载到另外一个进程来完成

打击者和研究人员常常缔造新的技能来实现注入并提供隐藏本人的目标。这篇文章详细引见了十种常见和新兴的技能,但还有别的的不有说起,如COMM挟制。 防止者在其义务中将永恒不会“完成”检测和戒备隐形进程注入的工作,由于入侵者永恒不会休止立异。

在EndGame[译者注:原文颁布的web称谓为EndGame],咱们不竭研究后代的隐藏技能,并将这些技能带入咱们的产品中,给产品提供护卫。咱们的层级恪守或许检测加载某些维持注入(如AppInit DLL,COM Hijack等)的恶意DLL,经过咱们的shellcode注入防护软件,或许及时戒备很多形式的代码注入,而且或许检测在内存中运行的恶意注入的无效负载。咱们正在恳请专利的无文件打击检测技能或许让咱们的平台比市场到任何别的产品更无效地戒备代码注入,同时还经过新兴的代码注入技能最大限定地提高绕过的弹性。

本文由看雪翻译小组 skeep 编译,来源Ashkan Hosseini@endgame’s blog

【via@看雪社区】

数安新闻+更多

证书相关+更多