写了个热血江湖外挂框架, 注入一个含有mfc资源的dll到游戏进程中去, 在游戏进程中可以呼唤出这个dll中的窗体.但是退出的时候有点问题.
如果从来没在游戏中呼唤出dll中的窗体, 那么当dll被卸载的时候, 一切正常.
但是如果一旦呼唤出dll的窗体, 那么当dll被卸载的时候, 有时候会使得游戏崩溃. 这是为什么啊?
当dl为debug版本, 且出现问题, 游戏崩溃的时候, 报错:
源码:
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
BOOL bKeyUp = lParam & (1<<31);
if ((VK_HOME == wParam) && bKeyUp && code == HC_ACTION)
{
if (NULL == g_wgDllDlg)
{
g_wgDllDlg = new CFzDllDlg;
g_wgDllDlg->Create(CFzDllDlg::IDD, NULL);
g_wgDllDlg->ShowWindow(SW_SHOWNORMAL);
}
else
{
if (g_wgDllDlg->IsWindowVisible())
g_wgDllDlg->ShowWindow(SW_HIDE);
else
g_wgDllDlg->ShowWindow(SW_SHOW);
}
}
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
BOOL SetHook()
{
if (NULL != g_hHook)
{
AfxMessageBox("g_hook != null");
return FALSE;
}
HWND hGameWnd = FindWindow(NULL, "YB_OnlineClient");
if (NULL == hGameWnd)
{
AfxMessageBox("not find window");
return FALSE;
}
DWORD dwGamePid = 0;
DWORD dwGameTid = 0;
dwGameTid = GetWindowThreadProcessId(hGameWnd, &dwGamePid);
//如果传递的是null, 那么这里获得的是exe的句柄, 可以用GetModuleFileName来验证
HMODULE hModule = GetModuleHandle("RxjhFzDll.dll");
//注意最后一个参数是thread id而不是process id
g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hModule, dwGameTid);
if (NULL == g_hHook)
return FALSE;
else
return TRUE;
}
BOOL UnSetHook()
{
bool bRet = false;
if (NULL != g_hHook)
{
bRet = ::UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}
return bRet;
}
int CRxjhFzDllApp::ExitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
if (NULL != g_wgDllDlg)
{
delete g_wgDllDlg;
g_wgDllDlg = NULL;
}
return CWinApp::ExitInstance();
}
完整的工程在附件中.
还请大家帮我看看, 不胜感激.
[课程]FART 脱壳王!加量不加价!FART作者讲授!