不同进程间的HOOK,用到共享数据段
来源:互联网 发布:linux opengl 安装 编辑:程序博客网 时间:2024/06/02 01:20
代码如下
DLL:
HHOOK g_hook=NULL;
extern "C" _declspec(dllexport)
LRESULT CALLBACK CallWndProc(
int nCode, // hook code
WPARAM wParam, // current-process flag
LPARAM lParam // address of structure with message data
)
{
if(nCode <0) return (CallNextHookEx(g_hook, nCode, wParam, lParam));
switch(nCode)
{
case HC_ACTION:
switch(wParam)
{
case WH_CALLWNDPROC:
break;
default:
break;
}
break;
default:
break;
}
return (CallNextHookEx(g_hook, nCode, wParam, lParam));
}
exe代码段:
DWORD dwThreadID = GetWindowThreadProcessId(hwnd, NULL);
HINSTANCE gDLL = ::LoadLibrary(L"../Release/Hook.dll");
//HINSTANCE gDLL = ::LoadLibrary(L"Hook.dll");
HHOOK gHook = ::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)GetProcAddress(gDLL, "CallWndProc"),gDLL,dwThreadID);
代码意图:通过加载HOOK注入DLL拦截指定窗口的特定消息
查看线程,已经正常加载Hook.dll文件,可为啥gHook的值为零...
刚学钩子..很迷糊这个!!!边学边看边练边用!请教高手了!!!如果可能的话,可否给个这类相关代码段!
自己找了,看了!!汗一个!!资料是多,可多了也让人犯晕!
觉得分给的少的话,解决问题后,可以再加分,谢谢,在线等
是不是路径有问题?
在watch窗口输入@err,hr,看看错误提示。
要把sethook函数放到dll里,比如我上面发这个例子
还有一种方法就是把g_Hook放到共享数据段里才可以
全局钩子不是这么写的,给你一个全局键盘的参考吧
http://www.3800hk.com/Article/cxsj/cjiajia/xtkzcjj/2005-08-06/Article_27326.html
重新帖一下代码:
看的容易,清楚一点,本来想修改一下...不过好像自己的权限不够,不能编辑修改!
Dll代码:
- C/C++ code
- HHOOK g_hook=NULL;extern "C" _declspec(dllexport) LRESULT CALLBACK CallWndProc( int nCode, // hook code WPARAM wParam, // current-process flag LPARAM lParam // address of structure with message data ) { if(nCode<0) return (CallNextHookEx(g_hook, nCode, wParam, lParam)); switch(nCode) { case HC_ACTION: switch(wParam) { case WH_CALLWNDPROC: //sprintf("jp"); break; default: break; } break; default: break; } return (CallNextHookEx(g_hook, nCode, wParam, lParam)); }
EXE代码:
- C/C++ code
- dwThreadID = GetWindowThreadProcessId(hwnd, NULL); //hmodHook = GetModuleHandle(L"../Release/Hook.dll"); gDLL = ::LoadLibrary(L"../Release/Hook.dll"); //gDLL = ::LoadLibrary(L"PetHook.dll"); HHOOK gHook = ::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)GetProcAddress(gDLL, "CallWndProc"),gDLL,dwThreadID); CPoint mouse; GetCursorPos(&mouse); ::SetWindowLong(hwnd,GWL_WNDPROC,(LONG)MyWndProc);(本来想直接用这个的,不过跨进程了,返回值为NU)
用dumpbin查看了一下dll发现函数名变了....
_CallWndProc@12
修改成这个,HOOK值也还是O
钩子是钩进别的进程里,但本身也和自己的进程也可以共享数据的!不然钩子就没啥作用了!!
全局钩子换0,我知道,但那样收到的消息就太多了,不方便处理,我要的是指定窗口的线程窗口消息!!!
就像SPY++那样,可以拦截特定窗口的特定消息...
extern "C" _declspec(dllexport)
定义输出会改变函数名....
改成相应的函数名也没办法认到!
所以后来我换成了
- C/C++ code
- #include "stdafx.h"#pragma data_seg("Shared")HHOOK g_Hook= NULL;#pragma data_seg()//extern "C" _declspec(dllexport) LRESULT [color=#993300]WINAPI[/color] CALLBACK CallWndProc( int nCode, // hook code WPARAM wParam, // current-process flag LPARAM lParam // address of structure with message data ) { if(nCode<0) return CallNextHookEx(g_Hook, nCode, wParam, lParam); switch(nCode) { case HC_ACTION: switch(wParam) { case WH_CALLWNDPROC: break; default: break; } break; default: break; } return CallNextHookEx(g_Hook, nCode, wParam, lParam); }
得出来的值也还是NULL
效果是点按扭后,会加载DLL,然后拦截指定窗口特定的消息.
再有一个问题,我用其它查看线程工具,看加载的DLL是否有定义加载进去的DLL和hook文件...好像也没有查找到
汗一个,自己搞定了
原来是因为DLL输出函数名变化的原因..
修正一下函数名就可以了!
- C/C++ code
- HHOOK gHook = ::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)GetProcAddress(hModule, "_CallWndProc@12"),hModule,dwThreadID);
结帖了
弱弱的说下:
嘿,嘿,改成extern "C" 又出现NULL错误了
又找不着了那个生成的函数名了....
改成__declspec(dllimport)
提示说,不能使用!!
我也犯晕中
dll 里
导出用 __declspec(dllexport)
导入用 __declspec(dllimport)
exe里
我直接生成一个.def 在里头直接导出...
现在可以了认到DLL函数符号了!
再弱弱的问一下:
- C/C++ code
- #include "stdafx.h"#include "PetHook.h"#pragma data_seg("sharedata") //共享数据段HHOOK glhHook=NULL; //钩子句柄。//HINSTANCE glhInstance=NULL; //DLL实例句柄#pragma data_seg() static HMODULE ModuleFromAddress(PVOID pv) { MEMORY_BASIC_INFORMATION mbi; if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) { return (HMODULE)mbi.AllocationBase; } else { return NULL; }}static LRESULT WINAPI GetMsgProc( int nCode , WPARAM wParam, LPARAM lParam ) { if(nCode<0) return CallNextHookEx(glhHook, nCode, wParam, lParam); switch(nCode) { case HC_ACTION: switch(wParam) { case WH_CALLWNDPROC: break; default: break; } break; default: break; } return CallNextHookEx(glhHook, nCode, wParam, lParam); } BOOL WINAPI SetHook(BOOL bInstall , HWND hWnd) //安装钩子。{ BOOL bOk; if(bInstall) { DWORD dwThreadID = GetWindowThreadProcessId( hWnd, NULL); glhHook=SetWindowsHookEx(WH_CALLWNDPROC,GetMsgProc,ModuleFromAddress(GetMsgProc),dwThreadID); bOk = (glhHook != NULL); } else { bOk = ::UnhookWindowsHookEx(glhHook); glhHook = NULL; } return bOk;}
为什么我在DLL文件里下断点,然后附加到进程中,只提示说找到断点,却不会在指定的位置停下来
再有拦截指定的WM_ACTIVATE
GetMsgProc函数里??能直接swicth ->nCode吗???主要是我下断,没办法停在我指定的位置.没办法判断值!!
高人指导一下下!!这样写回调GetMsgProc,应该可以吧!!
WINAPI == CALLBACK 是成立的吧!!!查了资料是这样说的,不过这边确认一下!
- 不同进程间的HOOK,用到共享数据段
- 进程各个不同数据段的位置
- SharedPreference 实现不同进程间的数据共享
- 进程通信 共享数据段
- linux进程的5中不同的数据段
- 不同进程间的共享问题
- 多进程 不同地址空间的数据共享问题
- 进程间的数据共享
- DLL共享数据段,实现多进程数据共享总结
- DLL共享数据段,实现多进程数据共享总结
- Dll的各进程之间共享-#pragma data_seg预处理指令用于设置共享数据段
- C#不同项目间数据的共享
- 不同进程通过共享内存实现数据共享
- 进程间共享数据
- 进程间数据共享
- DLL中建立进程共享数据段需要注意的语法问题
- Android SharePreference 在主进程和次进程间共享数据不同步出错
- 进程共享数据段#pragma data_seg原来要这么用
- 进入erlang的世界收藏
- 推荐一个开源的LMS系统ILIAS
- 使用SuperMap Object道路线数据集生成道路面数据集方法
- 分析Windows和Linux动态库
- socket关闭的close和shutdown区别
- 不同进程间的HOOK,用到共享数据段
- [译]使用Mochiweb构建百万级Comet程序,第一篇
- Oracle初学的迷惑!
- Erlang概述收藏
- SOA标准发展混乱 国内业务缺少经验
- Erlang 是什么
- 迅雷协议分析
- 结合栈空间巧用单件
- 验证方法(Spring Action)