实现dll注入的方法有很多,比如创建远程线程,使用注册表,消息钩取,替换原dll等
原理
实现dll注入的方法有很多,比如创建远程线程,使用注册表,消息钩取,替换原dll等。
这里简单介绍一下最常用的方法,通过创建远程线程,即使用CreateRemoteThread函数对运行中的进程注入dll。
大致的流程如下:
获取目标进程句柄
HANDLE hProcess = NULL;
//使用dwPID进程id获取目标进程句柄(然后控制进程)
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
将dll写入目标进程分配的内存中
HANDLE hProcess;
LPVOID pRemoteBuf = NULL;
DWORD dwBufSize;
// 在目标进程内存中分配dwBufSize大小的内存
pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);//返回值为分配所得缓冲区的地址(目标进程内存地址)
// 将dll写入分配的内存中
WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllPath, dwBufSize, NULL);
获取LoadLibraryW() API的地址
HMODULE hMod = NULL;
hMod = GetModuleHandle(L"kernel32.dll");
LPTHREAD_START_ROUTINE pThreadProc;
pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryW");
在进程中运行LoadLibraryW线程
HANDLE hProcess = NULL, hThread = NULL;
// 在进程中运行LoadLibraryW线程
hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);
WaitForSingleObject(hThread, INFINITE); //等待hThread事件执行完毕
通常情况下利用好工具就可以实现我们想要的dll注入,不过学习原理能够帮助我们理解,同时一些重要的函数也是逆向学习过程中一定要积累的。
参考:
《逆向工程核心原理》书籍