一、在上节课DLL注入窗口我们已经实现了注入dll,这节课我们利用线程注入
DWORD WINAPI 窗口函数地址(LPVOID arg) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); DLLTEST dt; dt.DoModal(); FreeLibraryAndExitThread(theApp.m_hInstance, 123);//自动卸载dll return 1; } BOOL CMFCDLLApp::InitInstance() { CWinApp::InitInstance(); DWORD 线程ID = 0; ::CreateThread(0, 0, 窗口函数地址, 0, 0, &线程ID); return TRUE; }
二、在窗口添加三个按钮,分别实现调试信息输出、解绑调试信息,获取护甲值
DWORD 读地址(UINT_PTR 地址) { __try { return *(DWORD*)地址; } __except (1) { return 0; } } VOID CALLBACK 护甲(HWND h, UINT arg2, UINT_PTR arg3_id, DWORD time) { KillTimer(h, 11111); const char* 参数1 = "player"; UINT_PTR 返回值 = 0; UINT_PTR 函数地址 = 0x60C1F0; __asm { push 参数1 call 函数地址 add esp, 4 mov 返回值, eax } DWORD 护甲 = 读地址(读地址(返回值 + 0xD0) + 0x174); char buf[256]; sprintf_s(buf, "护甲=%d\r\n",护甲); printf(buf); }; void DLLTEST::OnBnClickedButton1() { HWND 游戏窗口句柄 = FindWindowA("GxWindowClassD3d", "魔兽世界"); ::SetTimer(游戏窗口句柄, 11111, 1, 护甲); } void DLLTEST::OnBnClickedButton2() { AllocConsole(); FILE* file = 0; freopen_s(&file, "CONOUT$", "w+t", stdout); } void DLLTEST::OnBnClickedGbtsck() { FreeConsole(); }
三、查看效果