29. 利用系统进程加载Dll到其他进程中(系统进程可能会出现bug)
[toc]
一、将Dll注入到系统进程后加载Dll到其他进程中
1.编写Dll1.dll文件,注入到winlogon.exe中
dllmain1.c
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
50//dllmain1.c
HMODULE g_hDll = NULL;
DWORD WINAPI UnloadThreadCallBack(PVOID param);
DWORD WINAPI UnloadThread();
// DLL 主函数
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
LoadDll2();
g_hDll = (HMODULE)hModule;
break;
}
case DLL_THREAD_ATTACH:
{
break;
}
case DLL_THREAD_DETACH:
{
break;
}
case DLL_PROCESS_DETACH:
{
break;
}
default:
break;
}
return TRUE;
}
DWORD WINAPI UnloadThread()
{
HANDLE hThread = CreateThread(NULL, 0, UnloadThreadCallBack, NULL, 0, NULL);
CloseHandle(hThread);
return 0;
}
DWORD WINAPI UnloadThreadCallBack(PVOID param)
{
FreeLibraryAndExitThread(g_hDll, 0);
return 0;
}Load1.h
1
2
3
4
5
6
7
8//Load1.h
int LoadDll2();
BOOL SeDebug(BOOL bEnablePrivilege);
DWORD FindProcessPID(const wchar_t* ProcessName);
BOOL Inject(DWORD dwProcessID, const WCHAR* szPath);Load1.c
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88//Load1.c
int LoadDll2()
{
SeDebug(TRUE);
DWORD dwPid = FindProcessPID(L"Notepad.exe");
Inject(dwPid, L"C:\\Dll2.dll");
return 0;
}
BOOL SeDebug(BOOL bEnablePrivilege)
{
HANDLE hCurrentToken = NULL;
BOOL getCurrentToken = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hCurrentToken);
LUID luid;
if (!LookupPrivilegeValue(NULL, L"SeDebugPrivilege", &luid))
{
return FALSE;
}
TOKEN_PRIVILEGES PrivToken;
PrivToken.PrivilegeCount = 1;
PrivToken.Privileges[0].Luid = luid;
if (bEnablePrivilege)
PrivToken.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
PrivToken.Privileges[0].Attributes = 0;
if (!AdjustTokenPrivileges(
hCurrentToken,
FALSE,
&PrivToken,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES)NULL,
(PDWORD)NULL))
{
return FALSE;
}
return TRUE;
}
DWORD FindProcessPID(const wchar_t* ProcessName)
{
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32W process = { 0 };
process.dwSize = sizeof(process);
if (Process32FirstW(snapshot, &process)) {
do {
if (!wcscmp((const wchar_t*)process.szExeFile, (const wchar_t*)ProcessName))
break;
} while (Process32NextW(snapshot, &process));
}
CloseHandle(snapshot);
return process.th32ProcessID;
}
BOOL Inject(DWORD dwProcessID, const WCHAR* szPath)
{
//LoadLibrary
//CreateRemoteThread
//1.打开目标进程获取句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
//2.在目标进程体内申请空间
LPVOID lpAddress = VirtualAllocEx(hProcess, NULL, 0x100, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
//3.写入DLL路径
SIZE_T sWriteLength = 0;
BOOL bRet = WriteProcessMemory(hProcess, lpAddress, szPath, ((wcslen(szPath) + 1) * 2), &sWriteLength);
if (bRet == FALSE)
{
MessageBoxW(NULL, L"WriteProcessMemory Failed!", L"Error", MB_OK);
}
//4.创建远程线程,执行回调
HANDLE hThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryW, lpAddress, NULL, NULL);
//5.等待远程线程执行结束(LoadLibrary返回了)
WaitForSingleObject(hThread, INFINITE);
//6.释放空间
VirtualFreeEx(hProcess, lpAddress, 0, MEM_RELEASE);
//7.释放句柄
CloseHandle(hProcess);
CloseHandle(hThread);
//8.返回结果
return TRUE;
}
2. 编写Dll2.dll文件,Dll2.dll将被winlogon.exe加载到notepad.exe中
完整代码
1 | //dllmain2.c |
二、利用重写的Nt函数与系统进程打开句柄与加载Dll
1.测试重写Nt函数读取notepad的数据
- 导入重写的函数
- 编写代码并运行
main.c
1 |
|
2.测试重写Nt函数读取数据并继承父进程打开的句柄
1.父进程程序main.exe
1 |
|
2.子进程程序Project1.exe
1 |
|
3.解决二个Bug
- 第一个bug是头文件
<winternl.h>写在``windows.h前面会失效。解决办法是写在windows.h`后面就行 - 第二个bug是头文件
<winternl.h>与syscalls_all.h有重复声明的结构体,解决办法是将syscalls_all.h里面的重复结构体注释掉而后将<winternl.h>包含在syscalls_all.h中
3.将Dll注入到系统进程后打开其他进程句柄,传递给子进程(winlogon失败,calculator与explorer成功)
1.导入SysWhispers2库文件到项目中
2.编写Dll1.dll代码
Dllmain1.c
1 | //dllmain.c |
Load1.h
1 |
|
Load1.c
1 | //Load1.c |
3.编写子进程程序main.exe
main.c
1 | ``` |
Load1.h
1 |
Load1.c
3.保持Dll2.dll代码
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
