前言
最近在学游戏实战逆向的一些东西,记些微不足道的笔记。之前也有做过关于dll注入的逆向题,当时官方wp是结合函数名泄露写dll注入解的,我复现的时候是照着别人的wp结合ce分析挖掘dump代码做的,因为不太理解dll注入,坑留到现在,所以先补一补dll注入的一些知识和API的学习。
什么是dll注入
dll(Dynamic Link Library)意为动态链接库,一般dll文件里面通常包含各种功能实现的函数等。
dll注入就是将自己编写的dll注入到进程中去,常用的注入方式是远程线程注入,这里主要记录一下这种注入方式
DLL里编写实现我们功能的代码,在加载入进程中后让其立马执行
远程线程注入dll
常规步骤如下:
查找窗口,获取窗口的句柄
1 2 3 4 5 6 7 8
| HWND hWnd = FindWindowA("Valve001", "Counter-Strike");
if (NULL == hWnd) { MessageBox(NULL, "FindWindow Error", "error", MB_OK); return; }
|
根据窗口句柄,查找进程PID
1 2 3 4
| DWORD DwPid = 0; GetWindowThreadProcessId(hWnd, &DwPid);
|
根据进程PID,获得进程句柄
1 2 3 4 5 6 7
| HANDLE hProHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DwPid);
if (NULL == hProHandle) { MessageBox(NULL, "OpenProcess Error", "error", MB_OK); return; }
|
给远程进程申请空间,并且返回空间的首地址
1 2 3 4 5 6 7
| LPVOID lpAddr = VirtualAllocEx(hProHandle, NULL, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (NULL == lpAddr) { MessageBox(NULL, "VirtualAlloc Error", "error", MB_OK); return; }
|
将要注入的DLL的路径写入进程内存中
1 2 3
| const char* Path = "E:\\游戏逆向学习\\glCSEzCheat\\Release\\glCSEzCheat.dll"; WriteProcessMemory(hProHandle, lpAddr, Path, strlen(Path) + 1, NULL);
|
远程进程开辟线程,调用LoadLibrary,加载dll
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
| HMODULE LDhm = LoadLibrary("Kernel32.dll"); if (LDhm == NULL) { MessageBox(NULL, "加载失败", "ERROR", MB_OK); } LPTHREAD_START_ROUTINE lpstart = (LPTHREAD_START_ROUTINE)GetProcAddress(LDhm, "LoadLibraryA");
HANDLE hThreadHandle = CreateRemoteThread(hProHandle, NULL, 0, lpstart, lpAddr, 0, NULL);
if (hThreadHandle == NULL) MessageBox(NULL, "CreatThread Error", "error", MB_OK);
WaitForSingleObject(hThreadHandle, INFINITE); VirtualFreeEx(hProHandle, lpAddr, strlen(Path) + 1, MEM_DECOMMIT); CloseHandle(hThreadHandle); CloseHandle(hProHandle);
|
调用退出代码,释放远程线程的dll
与注入类似,就是远线程调用FreeLibrary卸载DLL
参考资料
iBinary:https://www.cnblogs.com/iBinary/p/7898189.html
Comments