在Dll注入技术学习中,远程线程注入可以说是最容易理解的一种注入技术了。通过这种技术,我们也可以触类旁通其他注入技术。
原理
现在有三个程序:目标注入进程、注入加载进程以及Dll。
我们都知道一个exe文件会去加载自己所需要的Dll去运行,通常是一些系统Dll,如果有需要,也会加载自己编写的Dll。这里就出现了我们的利用点,也就是windows肯定提供了API供我们使用去加载Dll。那么接下来的思路就是利用API函数加载Dll并执行Dll中的函数。
执行思路:通过目标进程pid获取进程句柄 -> 在目标进程开辟空间 -> 在开辟空间写入Dll的路径 -> 目标进程中创建远程线程加载Dll。
API
获取进程句柄
1 2 3 4 5 6
| HANDLE OpenProcess( [in] DWORD dwDesiredAccess, [in] BOOL bInheritHandle, [in] DWORD dwProcessId );
|
加载Dll(重要)
1 2 3 4
| HMODULE LoadLibraryA( [in] LPCSTR lpLibFileName );
|
获取Dll的导出函数
1 2 3 4 5
| FARPROC GetProcAddress( [in] HMODULE hModule, [in] LPCSTR lpProcName );
|
开辟内存空间
1 2 3 4 5 6 7 8
| LPVOID VirtualAllocEx( [in] HANDLE hProcess, [in, optional] LPVOID lpAddress, [in] SIZE_T dwSize, [in] DWORD flAllocationType, [in] DWORD flProtect );
|
写入内存空间
1 2 3 4 5 6 7 8
| BOOL WriteProcessMemory( [in] HANDLE hProcess, [in] LPVOID lpBaseAddress, [in] LPCVOID lpBuffer, [in] SIZE_T nSize, [out] SIZE_T *lpNumberOfBytesWritten );
|
创建远程线程
1 2 3 4 5 6 7 8 9 10
| HANDLE CreateRemoteThread( [in] HANDLE hProcess, [in] LPSECURITY_ATTRIBUTES lpThreadAttributes, [in] SIZE_T dwStackSize, [in] LPTHREAD_START_ROUTINE lpStartAddress, [in] LPVOID lpParameter, [in] DWORD dwCreationFlags, [out] LPDWORD lpThreadId );
|
代码
这里获取进程pid偷懒了,是直接在任务管理器中查看的。如果想实现自动获取,可以通过进程遍历来实现。
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
| #include<iostream> #include<Windows.h>
int main() { DWORD pid = 32064;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);
HMODULE hMod = LoadLibrary("Kernel32.dll"); FARPROC fun = GetProcAddress(hMod, "LoadLibraryA"); char DllPath[] = "F:\\code_py&C\\vs2017\\injecte\\Dll1\\Debug\\Dll1";
LPVOID address = VirtualAllocEx(hProcess, NULL, strlen(DllPath), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess, address, DllPath, strlen(DllPath), NULL);
CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)fun, address, 0, NULL);
}
|
首先开启测试注入进程
接着运行Dll注入进程,记得关闭杀毒软件
在注入进程也可以找到我们的Dll
进阶实现
我们可以依赖可信任进程进行注入,例如注入Services.exe
这个进程,首先先将a.dll远线程注入到Service.exe中,再利用a.dll将b.dll远线程注入的待注入进程中。
这里偷一张图
a.dll注入成功后还可以“功成身退”,利用FreeLibraryAndExitThread()
把自己卸载掉并且退出线程。