前一篇介绍了API Hook的几种方法,本文则直接以CopyFile为例采用DLL注入的方法来展示编码流程。
一个完整的HOOK过程包括四个部分:
1)待注入的DLL
2)DLL注入器
3)目标进程
4)主程序
DLL注入器的实现
注入器需要实现的功能就是将用户DLL注入到目标进程中。可设计为一个独立DLL,方便复用。DLL可规划两个接口,类似内存分配的malloc/free的配对使用。接口如下:
BOOL WINAPI Inject(LPCTSTR lpszUsrApiDLL, LPCTSTR lpszHookProcess);
BOOL WINAPI Eject(LPCTSTR lpszUsrApiDLL, LPCTSTR lpszHookProcess);
具体实现上代码:
寻找目标进程PID
采用CreateToolhelp32Snapshot、Process32First、Process32Next、Module32First、Module32Next
一系列函数即可获得进程列表及模块列表。不是本文重点,就不上代码了。
执行注入
直接上代码
/* 注入,将dll注入到指定进程中,只给出核心代码 */
int InjectLib(DWORD dwProcessId, LPCTSTR lpszLib)
{
PTHREAD_START_ROUTINE pfnRemote =(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");
/*打开目标进程*/
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
/*在目标进程上分配可读写空间*/
int nMemSize =strlen(lpszLib) + 1;
void *pRemoteMem = VirtualAllocEx(hProcess, NULL, nMemSize, MEM_COMMIT, PAGE_READWRITE);
/*写目标进程,将用户DLL加入目标进程空间(未加载)*/
int ret = WriteProcessMemory(hProcess, pRemoteMem, (void*)lpszLib, nMemSize, NULL);
/*在目标进程中建立远线程*/
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, pfnRemote, pRemoteMem, 0, NULL);
/*目标进程中执行LoadLibrary即将用户DLL真正加载起来生效*/
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(hProcess, pRemoteMem, 0, MEM_RELEASE);
CloseHandl