Windows下的7种DLL劫持技术
在本文中,我将列出半打可以在Windows运行用户模式的进程中使用DLL注入技术。也许可能会有更多类似的技术,但我正在和你分享的是我所拥有的第一手的技术。
AppInit_DLLs
人们以前往往依赖于AppInit_DLLs注册表项。它是操作系统加载程序查询此值并加载创建进程时指定的DLL。我在很长一段时间没有使用这种技术(最后一次我使用它在Windows XP上),而且我听说现在受到恶意软件的广泛使用,所以它也受到限制或被停止使用了。
SetWindowsHookEx API
使用API函数SetWindowsHookEx()可以把一个应用程序定义的钩子子程安装到钩子链表中。 SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的 Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个 Hook子程需要调用CallNextHookEx函数。它支持各种各样的钩链(CBT,Journal,Window消息,键盘,鼠标等)。
当使用SetWindowsHookEx API时,你就是在在指示操作系统将自定义HookDLL注入到其相关的其他进程中。当其他进程从USER32.dll导入/使用功能时,Windows Hook就会工作。
The Image File Execution Options (IFEO) key
该 IFEO注册表项是非常方便的。它允许你指定OS加载程序在创建给定进程、启动给定的AppVerifier插件、更改进程堆选项等情况时调用调试程序。
现在让我们回过头来说,我已经在IFEO键上做了一个小实验,创建了一个AppVerifier插件,注入到我选择的进程中。
Remote threads
这种技术依赖于将远程线程创建到想要注入的所需进程中。远程线程的代码将会非常简单地在该目标进程的上下文中调用LoadLibrary。请注意,许多防病毒软件都会将创建远程线程标记为恶意活动。
Implicitly tracking all processes
此方法往往会依赖于进程创建API的Hook,例如:kernel32.CreateProcess [Internal]或较低的API。通过跟踪其他进程的创建,你就会有机会将DLL注入到新进程中。
该技术背后的基本思路如下:
1、枚举所有现有进程
2、将你的DLLHook注入所有正在运行的进程。这很重要,并且也会使你的注射器可以在执行注射器之前执行的进程达到最高速度。
3、Hook k32!CreateProcessInternalW在每个进程中。如果你能hook到更好的那些就最好了。例如在ntdll!NtCreateProcess *
4、你注入的DLL必须明确的Hook进程create API,并在调用时执行以下操作:
1.暂停创建子进程
2.注入你的Hook,这本质上是“跟踪”
3.恢复流程。现在这个子进程现在也将Hook任何新的进程
这种技术会给你一种你正在跟踪所有流程的错觉。不过它是有效的,我已经看到它被用于很多安全产品中了。通过hook Explorer.exe(shell),你可以跟踪从“开始菜单”启动的所有进程。
当然,这种技术是有限的,它是可以被躲避的,不过当你在只有用户模式访问时它很有用。
AppCompat shimming layer
其实,很长时间里我都不知道这种注入方式,直到我在微软工作时接触到了EMET项目。
该程序的兼容性机制其实并不会真的记录了第三方开发者,但当我在EMET项目中使用它时这一情况翻转了。
其实质是有一个名为AppPatch.dll的系统DLL ,它读取一个匀场数据库(又称SDB)。该数据库是自定义格式,它可以描述各种应用程序兼容性调整/修补功能:
1、内存搜索/替换 – >补丁代码在一个给定的模块中,当该模块加载
2、加载/注入一个给定进程的DLL。可以使用通配符等。
3、假API返回等。
EMET项目中我是使用方法第二种来注入DLL到所需的进程中。每个EMET重新配置时,基本思想就是在Fly中生成SDB。EMET嵌入了懂得如何生成SDB的代码,然后在系统中注册该SDB。
请注意,AppPatch机制被烘焙到操作系统的进程加载程序(在ntdll.dll内)。因此,它不是真正的“注入”,它更像是加载进程的一部分。
Kernel drivers
最后的这一种但并非是不重要的,只是它不是一种纯粹的用户模式下的方法,使用内核驱动程序是将代码注入所有正在运行的进程的一种可靠方法。据我所知,现在有名气的A / V软件都使用了它。他们会在注册图像时创建通知,然后将在用户模式下需要执行并注入的一些APC进行排队。
结论
总而言之,DLL注入是一个非常引人入胜的主题,它具有各种注入技术可供选择,对系统开发人员来说真的非常有帮助。而根据你的不同选择,注入会有不同的弹性、安全性(不被杀毒软件所捕获)以及持续性。