Dll注入本质

将dll映射到目标进程的地址空间当中,从而取得执行dll代码的机会

DLL常用注入方式

注册表

优缺点

简单,全局注入,但是很死板,不太使用,不主动,也不太稳定

并且必须有调用System32下的User32.dll文件的才行(Windows的机制),否则失败,成功会执行DLL_PROCESS_ATTACH下的东西

注册表位置

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\

下面的Applnit_DLLs和LoadAppInit_DLLs

注册表键值

注册表API 说明
RegOpenKeyEx 打开注册表键值
RegQueryValueEx 查询键值
RegSetValueEx 设置键值
RegCloseKey 关闭键值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <string.h>
#include <Windows.h>

int main(void)
{
HKEY key;
WCHAR ApplnitvAL[] = L"test.dll";
DWORD LoadAppInitvAL = 1;
WCHAR subkey[] = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows";
LSTATUS ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey, 0, KEY_ALL_ACCESS,&key);
if (ret != ERROR_SUCCESS) {
printf("OPEN KEY FAILED !\n");
}
ret = RegSetValueEx(key, L"Applnit_DLLs", 0, REG_SZ, (const BYTE*)ApplnitvAL, sizeof(WCHAR)*(wcslen(ApplnitvAL) + 1));
if (ret != ERROR_SUCCESS) {
printf("SET KEY FAILED !\n");
}

/*ret = RegSetValueEx(key, L"LoadAppInit_DLLs", 0, REG_DWORD, (const BYTE*)&LoadAppInitvAL, sizeof(DWORD));
if (ret != ERROR_SUCCESS) {
printf("SET KEY FAILED !\n");
}*/
RegCloseKey(key);
return 0;
}

win7和win10无法成功,winxp才可以,之后把dll文件放在system32下面即可

挂钩注入dll

优缺点

灵活主动,线程,全局,但是只能消息处理,很麻烦

相关API

1
2
3
SetWindowsHookEx(int idHook, HOOKPROC lpfn,HINSTANCE hMod, DWORD dwThreadld) //挂钩
UnhookWindowsHookEx(HHOOK hhk) //解除挂钩
LRESULT WINAPI CallNextHookEx(HHOOK hhk,int nCode, WPARAM wParam,LPARAM lParam)

简单描述

SetWindowsHookEx只能hook带gui的程序,在GUI应用程序当中,有个捕获消息的工作,之后会把挂钩到进程当中的dll都处理一遍,依次执行完dll后再会去处理gui当中的消息处理,当UnhookWindowsHookEx则在捕获消息后不执行dll直接返回消息处理,挂在每一个挂上去dll最后会执行CallNextHookEx,才会真正实现注入,主要是把执行权限向下传递,否则会断掉传递的过程,而直接返回到GUI应用程序中

远程线程注入dll

优缺点

线程独立,针对进程,比较复杂,前提还得有权限

相关API

1
2
3
4
5
6
7
openProcess // 打开目标进程句柄
CreateRemoteThread //创建线程
LoadLibraryA或LoadLibraryw //载入dll
VirtualAllocEx //申请空间
VirtualFreeEx //释放空间
ReadProcessMemory
WriteProcessMemory

简单描述

首先要获得目标进程句柄以及权限,给目标进程创建属于这个进程的线程,通过创建的线程,去调入我们的dll,从而载入DLL触发DLL_PROCESS_ATTACH

函数转发器注入dll

优缺点

用户无感,防不胜防,但是要能过代码签名

简单描述

先确定目标进程会 调用哪一个dll,之后写入同名dll,把旧的dll改名字,把函数接口加上去即可,保证功能正常