首页
社区
课程
招聘
关于SetWindowsHookEx的一个小疑惑,在线等大神
发表于: 2015-8-2 15:59 3924

关于SetWindowsHookEx的一个小疑惑,在线等大神

2015-8-2 15:59
3924
最近在摆弄钩子的时候遇到一个这样的问题。

我有一个DLL文件,里面有两个函数和一个全局变量如下所示

static int number=0;
HHOOK m_Hook = NULL;

LRESULT CALLBACK hookfunc(int nCode, WPARAM wParam, LPARAM lParam)
{
        return CallNextHookEx(m_Hook, nCode, wParam, lParam);
}

__declspec(dllexport) void SetHook(int x)
{
        number = x;
        m_Hook = SetWindowsHookEx(WH_CBT, hookfunc, GetModuleHandle(L"me.dll"), 0);
}

我的注入器加载的时候就load了这个dll。
然后需要的时候就调用Sethook这个函数。同时将一个数字传递进去(这个数字是可变的)
我去查了一下核心编程,书上貌似是说把进程内存空间里面的DLL映射到另一个进程。

但是我测试的时候发现,number这个变量在注入以后是0,并不是我传递进去的数字。不知道有没有大神知道应该怎么做呢?(尽量不使用进程通信之类的方案,我想直接把我设定好的DLL复制到另外一个进程)

在线等大神。也拜托大神说明下问题的原因。

P.S:钩子函数里面没有执行任何功能,我写在了DLL加载的函数里面。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
每个进程的空间都是私有的,即使加载同一个DLL也一样。假设DLL访问自身的全局变量a(地址:0x12345678),那N个加载了改DLL的进程中的地址0x12345678都是自身私有的。Dll没有自己的地址空间,所以依赖于进程,Dll访问的0x12345678其实都是各个进程自己的0x12345678。
2015-8-2 16:19
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我是在挂钩之前就对这个进行了修改,而且书上也说是映射当前内存空间的地址。我看了论坛某个帖子
http://bbs.pediy.com/showthread.php?p=1118526
这个里面说
“(发现钩子dll还可以实现进程通信,A进程载入钩子dll,修改钩子dll全局变量a,而后SetWindowsHookEx,B进程被注入,B调用钩子dll显示a,结果与进程A所初始化的变量一模一样。B进程再度修改a,进程A负责显示a,结果仍然一样。  而这个a是两个进程都有的,只不过被映射到同一个物理地址上) ”
2015-8-2 16:23
0
雪    币: 39
活跃值: (2901)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
#pragma comment(linker, "/SECTION:.SHARED,RWS")
#pragma data_seg(".SHARED")
static int number=0;
HHOOK m_Hook = NULL;
#pragma data_seg()
写成上述这样就可以了。
光是定义成全局变量是不行的,无法共享。
2015-8-2 18:33
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
5
楼上正解, 需要定义共享区段。
2015-8-2 20:01
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
跨进程的映射是FileMapping,注入DLL一般是用LoadLibrary,LoadXXX是不会把已加载的数据段一起映射的,除非该数据段含有共享的属性。把共享的全局变量单独放到一个属性为共享的节里面就好,这是常规做法。
2015-8-2 20:07
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼上大神的办法确实可行,但是要注意传递对象的时候要注意指针的问题。
2015-8-2 21:10
0
游客
登录 | 注册 方可回帖
返回
//