Windows 下的 7 种 DLL 劫持技术

简介: 本文讲的是Windows 下的 7 种 DLL 劫持技术,在本文中,我将列出半打可以在Windows运行用户模式的进程中使用DLL注入技术。也许可能会有更多类似的技术,但我正在和你分享的是我所拥有的第一手的技术。
本文讲的是 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注入是一个非常引人入胜的主题,它具有各种注入技术可供选择,对系统开发人员来说真的非常有帮助。而根据你的不同选择,注入会有不同的弹性、安全性(不被杀毒软件所捕获)以及持续性。




原文发布时间为:2017年5月24日
本文作者:Change
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
目录
相关文章
|
3月前
|
存储 Java C语言
Windows 下 JNI 调用动态链接库 dll
Windows 下 JNI 调用动态链接库 dll
59 0
|
6月前
|
监控 编译器 API
[笔记]Windows核心编程《二十二》注入DLL和拦截API(一)
[笔记]Windows核心编程《二十二》注入DLL和拦截API
143 0
|
6月前
|
人工智能 缓存 Shell
[笔记]Windows核心编程《二十》DLL的高级操作技术(二)
[笔记]Windows核心编程《二十》DLL的高级操作技术(二)
147 0
|
3月前
|
存储 Java C++
Windows 下 JNA 调用动态链接库 dll
Windows 下 JNA 调用动态链接库 dll
41 0
|
4月前
|
监控 安全 API
5.9 Windows驱动开发:内核InlineHook挂钩技术
在上一章`《内核LDE64引擎计算汇编长度》`中,`LyShark`教大家如何通过`LDE64`引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的`InlineHook`函数挂钩其实与应用层一致,都是使用`劫持执行流`并跳转到我们自己的函数上来做处理,唯一的不同的是内核`Hook`只针对`内核API`函数,但由于其身处在`最底层`所以一旦被挂钩其整个应用层都将会受到影响,这就直接决定了在内核层挂钩的效果是应用层无法比拟的,对于安全从业者来说学会使用内核挂钩也是很重要。
40 1
5.9 Windows驱动开发:内核InlineHook挂钩技术
|
4月前
|
网络协议 安全 API
9.9 Windows驱动开发:内核远程线程实现DLL注入
在笔者上一篇文章`《内核RIP劫持实现DLL注入》`介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过`NtCreateThreadEx`这个内核函数实现注入DLL的目的,需要注意的是该函数在微软系统中未被导出使用时需要首先得到该函数的入口地址,`NtCreateThreadEx`函数最终会调用`ZwCreateThread`,本章在寻找函数的方式上有所不同,前一章通过内存定位的方法得到所需地址,本章则是通过解析导出表实现。
69 0
9.9 Windows驱动开发:内核远程线程实现DLL注入
|
5月前
|
开发者 Windows
什么是 Windows 操作系统 DLL 文件的 Side-by-Side Assemblies 技术
什么是 Windows 操作系统 DLL 文件的 Side-by-Side Assemblies 技术
50 0
|
5月前
|
API UED Windows
什么是 Windows 操作系统的 DLL 文件
什么是 Windows 操作系统的 DLL 文件
87 0
|
5月前
|
Unix Linux C#
使用 ABAP + OLE 消费 Windows DLL 文件里的代码和服务
使用 ABAP + OLE 消费 Windows DLL 文件里的代码和服务
27 0
|
6月前
|
Windows
[笔记]Windows判断文件是可执行文件exe/dll文件/驱动文件sys
[笔记]Windows判断文件是可执行文件exe/dll文件/驱动文件sys