我的hook怎么一点用都没有啊?

lsaturn 2003-11-24 06:37:59
hook的dll:
static HHOOK hHook = NULL;
HINSTANCE hInstance = NULL;
CDlgHook m_dlgHook;
BOOL __declspec(dllexport)__stdcall installHook()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInstance,0);
return TRUE;
}
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam) //键盘按键标识
{
case VK_F2:
m_dlgHook.DoModal();
break;
default:
break;
}
}
LRESULT RetVal = CallNextHookEx(hHook, nCode, wParam, lParam );
return RetVal;
}
进程代码:
if(hinstDLL=LoadLibrary((LPCTSTR)"keyHook.dll"))
{
instkbhook=(inshook)GetProcAddress(hinstDLL,"installHook");
instkbhook();
}
编译都通过,排除各种可能我估计是hook没有装上,这是为什么啊?
...全文
57 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsaturn 2003-11-26
  • 打赏
  • 举报
回复
谢谢,谢谢!
wangweintk 2003-11-26
  • 打赏
  • 举报
回复
已经给你发过了,是我自己以前作的一些测试和体会等,如有误请勿笑...
lsaturn 2003-11-26
  • 打赏
  • 举报
回复
wangweintk(枫杨)很感谢你的邮件,对我帮助很大:)
98440622 2003-11-25
  • 打赏
  • 举报
回复
注意dll是要被映射到调用进程的地址空间中的,所以当一个进程将一个dll映射到它的地址空间后,系统将同时创建全局数据变量和静态变量的实例,dll创建的任何对象均由调用进程所拥有,dll本身并不拥有任何东西。

__________ 参考 <<windows核心编程>>
wangweintk 2003-11-25
  • 打赏
  • 举报
回复
我的hHook和hInstance并没有定义在
#pragma data_seg("mydata")
...
#pragma data_seg()
之间,照样是全局钩子。

这个全局数据段,我想应该是dll进程和调用者之间共享数据块,至少和是不是全局的钩子应该不会有什么联系。
酒红绿叶 2003-11-25
  • 打赏
  • 举报
回复
#pragma data_seg("mydata")
HHOOK glhHook = NULL; // 安装的鼠标钩子句柄
HINSTANCE glhInstance = NULL; // DLL实例句柄
#pragma data_seg()
然后在.def文件中声明这个数据区,如下:
SECTIONS
mydata READ WRITE SHARED

这几句话是什么意思呢?



是定义一个全局数据段,,也就是定义全局的钩子,
这样才能对系统起作用!!
wangweintk 2003-11-25
  • 打赏
  • 举报
回复
不明白你的数据区是在干什么。

HHOOK glhHook = NULL; // 安装的鼠标钩子句柄
HINSTANCE glhInstance = NULL; // DLL实例句柄
只是定义了你要用的钩子句柄和dll句柄。

你把系统回调函数的输出去掉还不行嘛?
lsaturn 2003-11-25
  • 打赏
  • 举报
回复
我是做的一个dll啊!
HINSTANCE hInstance=AfxGetInstanceHandle();也不行!
必须有下面几句吗?
#pragma data_seg("mydata")
HHOOK glhHook = NULL; // 安装的鼠标钩子句柄
HINSTANCE glhInstance = NULL; // DLL实例句柄
#pragma data_seg()
然后在.def文件中声明这个数据区,如下:
SECTIONS
mydata READ WRITE SHARED
wangweintk 2003-11-25
  • 打赏
  • 举报
回复
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
可能不行,要按标准定义如下:

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)

不明白你为什么要输出?
wangweintk 2003-11-25
  • 打赏
  • 举报
回复
//获取进程实例句柄
HINSTANCE hInstance=AfxGetInstanceHandle();
lsaturn 2003-11-25
  • 打赏
  • 举报
回复
没人知道吗?
lsaturn 2003-11-25
  • 打赏
  • 举报
回复
大概明白了
楼上的有没有更多这方面的资料啊?
broadoceans 2003-11-25
  • 打赏
  • 举报
回复
从win2k开始,系统为DLL的不同实例维护不同的数据,就像类的成员数据,
不同对象的成员数据是不同的。
伪指令#pragma data_seg提供了在不同dll实例间共享数据的一种方法。

如果在dll中应用普通的全局变量,不同实例间的值是不同的。变量是映射到
进程的私有空间的。

Do you understand?
lsaturn 2003-11-25
  • 打赏
  • 举报
回复
其实我更想弄清楚原理啊:)
lsaturn 2003-11-25
  • 打赏
  • 举报
回复
lsaturn@163.net
谢谢!
wangweintk 2003-11-25
  • 打赏
  • 举报
回复
给个信箱,我发一个我做的例子给你
broadoceans 2003-11-25
  • 打赏
  • 举报
回复
#pragma data_seg("mydata")
HHOOK glhHook = NULL; // 安装的鼠标钩子句柄
HINSTANCE glhInstance = NULL; // DLL实例句柄
#pragma data_seg()
然后在.def文件中声明这个数据区,如下:
SECTIONS
mydata READ WRITE SHARED

从win2k开始,系统为DLL的不同实例维护不同的数据,就像类的成员数据,
不同对象的成员数据是不同的。
伪指令#pragma data_seg提供了在不同dll实例间共享数据的一种方法。
lsaturn 2003-11-25
  • 打赏
  • 举报
回复
把__declspec(dllexport)__stdcall这个去掉
则不用
#pragma data_seg("mydata")
...
#pragma data_seg()
也可以实现全局钩子!这是怎么回事啊?
为什么__declspec(dllexport)__stdcall要搭配
#pragma data_seg("mydata")
...
#pragma data_seg()
使用啊!
lsaturn 2003-11-25
  • 打赏
  • 举报
回复
楼上的这句话是什么意思?是不是说dll的全局变量在进入调用进程的地址空间后就没有了呢?
#pragma data_seg("mydata")
...
#pragma data_seg()
这个中间定义的数据是不是进程地址空间的全局变量,还是所有进程的共享内存?
wangweintk(枫杨)上面那个去掉了确实就不是全局的钩子了
我也很奇怪,我明明是照别人的例子来写的啊,别人说能行的我却不行了!
你是怎么实现全局钩子的呢?
lsaturn 2003-11-24
  • 打赏
  • 举报
回复
#pragma data_seg("mydata")
HHOOK glhHook = NULL; // 安装的鼠标钩子句柄
HINSTANCE glhInstance = NULL; // DLL实例句柄
#pragma data_seg()
然后在.def文件中声明这个数据区,如下:
SECTIONS
mydata READ WRITE SHARED

这几句话是什么意思呢?
加载更多回复(4)
x64进程远程hook,x64_远程调用函数,源码更新V1.8.2:2021/4/12 源码为下方连接帖子后续更新内容: 浅谈64位进程远程hook技术: https://bbs.125.la/forum.php?mod=viewthreadtid=14666356extra= 不管您是转载还是使用请保留版权,源码在精益论坛免费发布本人未获利,请不要用于非法途径。 --------------------------------------------------------------- 2021/4/12 模块源码 v1.8.2更新 1:修复 x64_远调用函数()在 易语言 主线程调用时造成消息无法回调,导致易语言主线程窗口卡死的问题。      感谢楼下易友发现的BUG,已经第一时间更新 2021/4/12 模块源码 v1.8.1更新 1:修复 hook全部卸载时的流程写法的一个错误,由于句柄的提前关闭导致多个hook点卸载不干净的问题 2:改写了消息回调时线程传参的代码优化,优化了其他一些小问题 3:  鉴于很多朋友需要,改写了模块自带实列,对TCP,UDP的两组封包函数做了hook实列写法 4:列子中同样增加对x64_远调用函数()的应用写了几个列子,如使用套接字取得本地或远端IP端口API调用的的应用实列 5:本hook模块不支持非模块内存区hook,如申请的动态分配页等,不是不能支持,只是觉得没有任何意义,对这方面有需求的,自行改写模块源码使用 提醒:hook回调函数中尽量减少耗时代码,时间越长返回越慢,回调中谨慎操作控件,如必须要用到可参考源码中实列写法采用线程操作 历史更新 --------------------------------------------------------------- 2021/3/1   模块源码v1.6更新: 1:修复  x64_远程调用函数()命令,在没有提供 寄存器 参数时,没有返回值的BUG。 --------------------------------------------------------------- 2021/2/28 模块源码v1.5更新: 一:修复win7 64位系统下枚举模块 出现部分模块长度出现负数的问题,从而导致部分win7用户不能使用 二:强化 远程hook64指令_安装 的稳定性:        1,穿插代码中增加对标志位的保护,避免hook位置长度下一条指令为跳转时产生跳转错乱的问题,强化了hook任意位置的定位        2,因为穿插代码中会调用API函数,而64位汇编必须遵守栈指针16字节对齐,故对穿插代码进行栈指针16字节对齐,增强稳定性        3,hook指令安装支持长度由6-127字节 变动 为 6-119字节,原因么没必要说了,代码优化造成的,稍微少了一点无所谓了        4,对模块回调进行了适当优化处理,增强稳定性 三:应支持的朋友需要故增加 x64_远程调用函数()命令,易语言可以直接远call64进程,且无需写汇编代码或机器码指令,支持15个参数,支持返回值,支持16个通用寄存器全部取得返回值       该功能调用即16字节栈对齐,不要用户管堆栈,代码内部构成,远线程执行,你只需要知道call有几个参数,需要什么寄存器,对应提供即可。 四:有朋友说原模块x64英文看了烦,那好吧就给改成了中文标识,弄得我自己也不习惯 五:源码内列子改了改,可以自己看,需要注意的是模块注释的很详细,使用前最好看一看,尤其是hook回调接口的写法和安装的写法最好按照模块列子中的写法来,除非你能把64hook模块组看懂一遍,对于一些对本模块一知半解的朋友请不要乱改乱发,这个模块我会继续增强的,只是工作原因时间有限,只能一点一点

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧