1.概念介绍:
注入与Hook:注入与hook经常被人们混淆,其实注入和hook是两种windows下的编程技术(当然,其他平台也有相关的技术),由于在安全编程中,两项技术经常被同时结合起来使用,所以常常导入混淆。今天我们就谈谈windows下的注入技术。
1.1 Hook:
hook 的中文名叫钩子,hook 是程序设计中最为灵活多变的技巧之一,hook对指定的进程 API 设置钩子,当指定的API 在调用的情况下,执行自己定义的钩子回调函数,同样实现的代码逻辑的改变(代码逻辑改变或者代码控制权的获取是黑客编程的根本目的,代码控制权被恶意代码获取,就会执行恶意代码中的逻辑),hook 我自己更愿意理解为一种机制,类似于中间人攻击(第三个人在通信的甲方与乙方之间,获取了通信的内容,并构造了假消息发送给甲或者乙方,从而对甲方或者乙方进行欺骗),hook技术也分为很多种(具体以后介绍)。windows中,hook有两种含义:
1.1.1 windows 系统提供的消息 hook 机制
由系统提供的消息钩子机制是由一系列的 API 提供的一种服务,这个系列的 API 可以完成对大多数应用程序的关键节点的函数API 或者消息做 hook 操作,为此,windows 为美中 hook 类型维护了一个钩子链表,我们可以通过一个系统 API 来完成对整个系统中所符合此机制的函数 API 或者消息 hook。
1.1.2 自定义的 hook 编程技巧
自定义的 hook 编程技巧是不使用 windows 下的 API, 在基于特定系统结构、文件结构、汇编语言的一种高级技术。
以下用一个表格来对个中hook(按照技术本质,不按照技术实现的具体细节)做一个分类:
windows提供的消息hook | ||
hook 技术 | ||
自定义hook | inline Hook | |
EAT hook(用户层hook),IAT hook(用户层hook),SSDT hook(内核层hook) |
以上是对hook的介绍,具体的技术实现其他博文中讲解。
2.注入:
注入(windows下的注入多指的是DLL的注入,也有代码片段的注入),DLL注入指的是将一个DLL文件注入到目标进程的进程空间(空间大小与运行平台有关),windows 32平台下,进程的虚拟内存空间通常是4GB,高2GB是系统内核空间(使用3ring API无法操作,需要提权技术),低2GB是用户态空间,用户态空间是程序员使用 3ring API 可以进行操作。DLL 注入技术最开始是用来满足程序员其他第三方的应用程序进行功能扩展的愿望,通俗的说:就是别人开发的程序,自己想要在这个程序上添加一下额外的功能,那么自己写一个 DLL 文件,DLL中实现了自己想要的功能,然后在程序运行的时候加载这个 DLL ,并调用里边的方法,使得原来的程序功能得到扩展。但是,技术出发点是好的,慢慢就会被别有用心的人用来做坏事,在 DLL 中写恶意代码,注入到计算机上的其他进程,结合 hook 技术,可以干很多的坏事。
2.1 :DLL 注入的几种技巧或者方法:
a) 注册表注入
b) ComRes 注入
c) APC 注入
d) 消息钩子注入
e) 远程线程注入
f) 依赖可信进程注入
g)劫持进程创建注入
h) 输入法注入
3 .DLL注册表注入技术的具体实现案例:
3.1 注册表注入的原理:
在windows系统中,整个系统的配置都保存在了注册表中,我们通过修改注册表中的配置来改变系统的行为,也可以改变某个进程的某些行为。当windwos中创建的进程,当User32.dll 被映射到这个进程中时,User32dll会收到 DLL_PROCESS_ATTACH通知,当User32.dll对这个通知进行处理的时候,会读取注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows 对应的值,并且调用 Loadlibrary 来载入这个字符串中指定的每个 DLL的时候,会调用每个DLL中的DLLMain函数,并将参数 fdwReason 的值设置为 DLl_PROCESSS_ATTACH,这样每一个DLL就能对自己进行初始化。由于注册表项中的DLL 在进程创建的早期就被User32.dll加载到了进程中,User32.dll不会检测每个DLL的载入是否成功,所以调用这些DLL中的函数可能会出问题。
3.2 实验步骤:
在windows桌面,使用 win + r:打开快速运行,输入 regedt32,回车打开注册表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-46TOdccb-1573112579696)(C:\Users\bsm\AppData\Roaming\Typora\typora-user-images\1573091871950.png)]
进入到注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uyLxcxrr-1573112579698)(C:\Users\bsm\AppData\Roaming\Typora\typora-user-images\1573107745472.png)]
修改注册表后,重启系统,随意打开一个进程,这里我打开LordPE ,使用PCHunter查看进程空间的模块情况:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n3a4AivQ-1573112579698)(C:\Users\bsm\AppData\Roaming\Typora\typora-user-images\1573108312734.png)]
至于Dll模块中的代码,可以自行发挥想象。
3.3 注意事项:
在众多的DLL注入方法中,使用注册表注入是最简单的一种方式。但是有一点要注意:
被注入的进程时64位,那么注入的DLL也应该是64位,32位对应32位。
注入32位进程,应该修改的注册表键为:
# 将下面注册表的键对应的值设置为 1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
# 将下面注册表的键对应的值设置为要注入的 DLL的路径
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\LoadAppInit_DLLs
注入64位进程,应该修改的注册表键为:
# 将下面注册表的键对应的值设置为 1
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs
# 将下面注册表的键对应的值设置为要注入的 DLL的路径
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WindowsNT\CurrentVersion\Windows\LoadAppInit_DLLs
3.4 注册表注入的缺点:
a) 注册表注入的方法只能将DLL注入到使用了User32.dll的GUI程序中(GUI程序中大多使用了User32.dll)。CUI程序大多不使用User32.dll,所以就不能使用注册表注入。
使用了User32.dll的GUI程序中(GUI程序中大多使用了User32.dll)。CUI程序大多不使用User32.dll,所以就不能使用注册表注入。
b) 注册表注入的方法会将DLL注入到系统中所有使用了User32.dll的所有GUI进程。但是如果我们的DLL中有错误导致崩溃,那么会影响到被注入的所有进程。影响范围会很大。