|

本人初学易语言,之前用vc编写了一个MFC DLL
//设置钩子
DWORD HookGameMainThread()
{
HWND hGame = GetGameHwnd();
DWORD ndThreadId=GetWindowThreadProcessId(hGame,NULL);
if(ndThreadId !=0)
{
g_hhGame = SetWindowsHookExA(WH_CALLWNDPROC,GameWndProc,NULL,ndThreadId);
}
return 1;
}
//回调函数
LRESULT CALLBACK GameWndProc(
__in int nCode,
__in WPARAM wParam,
__in LPARAM lParam
)
{
CWPSTRUCT *lpArg = (CWPSTRUCT *) lParam;
if (nCode == HC_ACTION)
{
DbgPrintf_Mine(“回调成功”);
DbgPrintf_Mine("消息:%2X,WParam:%2X,LParam:%2X",lpArg->message ,lpArg->wParam,lpArg->lParam);
}
return CallNextHookEx(g_hhGame,nCode,wParam,lParam);
}
注入后成功,回调成功,并且用SendMessageA发送窗口消息,可以输出对应的消息
改为易语言版的,使用动态链接库的方式,代码如下:
写到文件 (“outStr.txt”, 到字节集 (“”)) _临时子程序 () 返回 (0 ) 变量名 | 类 型 | 静态 | 数组 | 备 注 | 主线程 | 整数型 | | | 实例句柄 | 整数型 | | | handle | 整数型 | | |
进程ID = 进程_取自进程ID ()窗口句柄 = 内存. 读整数 (进程ID, 进制_十六到十 (“00CC6FFC”)) Dbg_Out (“窗口句柄:” + 到文本 (窗口句柄 )) 主线程 = 窗口_句柄取线程ID (窗口句柄 )Dbg_Out (“主线程:” + 到文本 (主线程 )) 钩子id = SetWindowsHookExA (4, &回调, 0, 主线程 )Dbg_Out (“LastError:” + 到文本 (GetLastError ()) )Dbg_Out (“钩子id:” + 到文本 (钩子id )) 置随机数种子 () |
回调 | 整数型 | | |
nCode | 整数型 | | | | wParam | 整数型 | | | | lParam | 整数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | CWPSTRUCT | CWPSTRUCT | | |
如果真 (nCode = 0 ) RtlMoveMemory (CWPSTRUCT, lParam, 16 ) Dbg_Out (“msg:” + 到文本 (CWPSTRUCT.message ) + “;wp:” + 到文本 (CWPSTRUCT.wParam ) + “;lp:” + 到文本 (CWPSTRUCT.lParam )) 返回 (1 ) 返回 (CallNextHookEx (钩子id, nCode, wParam, lParam )) 文件号 = 打开文件 (“outStr.txt”, , ) 如果 (文件号 > 0 ) 插入文本行 (文件号, Dbg_String ) 关闭文件 (文件号 )  
注入DLL,可以返回一个大于0的钩子id,但回调不成功,getlastError的代码是:126 ,找不到指定的模块。
SetWindowsHookExA (4, &回调, 0, 主线程)改为SetWindowsHookExA (4, &回调, handle = GetModuleHandleA (“DLL的名字”), 0),使用全局钩子,一样是的结果。
不知道是什么原因,GetModuleHandleA (“DLL的名字”)可以找到模块的句柄,但就是回调不成功。请大神们指教
|
|