关于键盘钩子的奇怪问题,快想破脑袋了!高手来解决一下!

Y___Y 2006-11-05 09:27:34
我编写了一键盘钩子,其DllMain函数如下
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hInst=HINSTANCE(hModule);
InstallHOOK();<--------------------------------------------添加处
break;
case DLL_PROCESS_DETACH:
if(g_hHook)UninstallHOOK();<-------------------------------添加处
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
添加的两句代码说明dll载入/卸载时自动载入/卸载钩子,于是我又编了一个exe文件来加载,键盘钩子像我预料的一样成功了,试验没任何问题。
这时我又用创造远程线程来注入这个dll(注入程序完全没问题),可是发现虽然已经注入,但键盘钩子完全不起作用,调试一下,InstallHOOK()执行正常,但无法截获键盘。不知为什么这样,高手解释一下。
我改了一下代码,如下
case DLL_THREAD_ATTACH:
InstallHOOK();
编译后将该dll插入IE,新打开一个网页后,键盘终于勾住了,但造成每IE新建一个线程,就勾一次,造成了按一个键,键盘记录文件记录多个相同的键。
以后无论怎么改进,都不尽人意,望高手指点一二!
...全文
371 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2006-11-06
  • 打赏
  • 举报
回复
我又用创造远程线程来注入这个dll(注入程序完全没问题),可是发现虽然已经注入,
但键盘钩子完全不起作用,调试一下,,但无法截获键盘。
不知为什么这样,高手解释一下。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1 重定位解决没?

2 如果 InstallHOOK()执行正常,那 HOOK 体中执行是否正常看过没?

3 我在汇编中一切正常。
KeSummer 2006-11-06
  • 打赏
  • 举报
回复
还是一句话,放在DLL_PROCESS_ATTACH,然后在InstallHOOK()入口下断,用附加进程调试,看安装钩子的函数返回什么.
Y___Y 2006-11-06
  • 打赏
  • 举报
回复
勉强实现了
但不知为什么InstallHOOK()加到DLL_PROCESS_ATTACH:就是不行,而加到DLL_THREAD_ATTACH:可以,但需要宿主程序新建一个线程。后一种情况比较好解释,前一种情况不知道怎么解释,不知需要作些什么才能解决前一种情况。
DentistryDoctor 2006-11-06
  • 打赏
  • 举报
回复
从这点代码看不出什么名堂来。
KeSummer 2006-11-05
  • 打赏
  • 举报
回复
To:ls
在DLL入口处将全局共享变量打印出来,用OutdebugString,Dbgview.exe捕捉.
低级键盘钩子会自动注入到当前接受键盘输入的进程中..最简单的处理方法是在DLL中判断宿主进程是否为ie,不为ie..return FALSE就不会加载这个DLL里.
Y___Y 2006-11-05
  • 打赏
  • 举报
回复
To:ls
我设置了一个全局共享变量说明钩子是否工作,但好像没什么作用,
而且一个更奇怪的问题,就是运行一段时间后,其他的进程也自动鬼使神差注入了这个dll(初始注入的进程不是IE,也会出现这种情况),真是怪事!
KeSummer 2006-11-05
  • 打赏
  • 举报
回复
我改了一下代码,如下
case DLL_THREAD_ATTACH:
InstallHOOK();
编译后将该dll插入IE,新打开一个网页后,键盘终于勾住了,但造成每IE新建一个线程,就勾一次,造成了按一个键,键盘记录文件记录多个相同的键。
以后无论怎么改进,都不尽人意,望高手指点一二!
---------------------------
再设置一个全局变量去说明钩子是否工作.

如果LZ要调试的话可以按照下面的步骤去做.
case DLL_PROCESS_ATTACH:在放一个MessageBox,然后在此下断点..
然后运行IE,附加进程到IE上,然后再安装钩子到IE,即可进行调试.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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