求助与讨论, 关于全局钩子的卸载方案。

lygf666 2012-03-15 05:33:06
程序的实现需求是监视一些我想要监视的进程,比如说在钩子函数中首先判断这个进程的名字是不是我想要的。是的话,我就可以做一些事情。但是大部分进程都是我不想监视的,怎么才能让不想要监视的进程吧我这个dll(钩子函数放在dll里)卸载掉。

钩子的加载和dll的注入是在我自己写的另一个程序A里通过SetWindowsHookEx加载的,是全局钩子。钩子相应函数是在我自己写的一个dll中,现在的方案是在程序A中控制dll钩子的加载和卸载,但是卸载就是全部都卸载了。我的要求是让我不想要监视的进程通过我的钩子的函数自己卸载掉。

可以做到吗。比如说在钩子函数中调用FreeLibrary 或者 Unhook什么的。
还是说全局钩子只能一次性全部卸载。


...全文
220 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lygf666 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lactoferrin 的回复:]
全局钩子只能一次性全部卸载
因为全局钩子dll的原本作用是在别的进程调用钩子过程,因此只要钩子还在,dll就不能卸载,否则触发钩子时会再次装载
[/Quote]
算了,反正每个程序都会链接很多dll,多我一个不多,少我这一个不少。就让他们链接上我的钩子dll吧。
康斯坦汀 2012-03-16
  • 打赏
  • 举报
回复
SetWindowsHookEx 是有参数的,你可以指定你要监视的进程和线程。
对于不需要监视的,钩子不起作用。
例子:


////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::InstallKeyBoardHook
// 安装局部线程键盘钩子。
//
BOOL CDsoFramerControl::InstallKeyBoardHook(HWND lWndCtrl,DWORD dwThreadID)
{

hook = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)KeyBoardMsgProc,v_hModule, dwThreadID);
if(hook != NULL)
{
ODS("Keyboard Hook installed!\n" );
hWndCtrl = lWndCtrl;
return TRUE;
}
return FALSE;
}

////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::UnInstallKeyBoardHook
// 卸载局部线程键盘钩子。
//
//
BOOL CDsoFramerControl::UnInstallKeyBoardHook()
{

BOOL unhooked = UnhookWindowsHookEx(hook);
ODS("Keyboard Hook Uninstall!\n");

return unhooked;
}
Lactoferrin 2012-03-15
  • 打赏
  • 举报
回复
全局钩子只能一次性全部卸载
因为全局钩子dll的原本作用是在别的进程调用钩子过程,因此只要钩子还在,dll就不能卸载,否则触发钩子时会再次装载
W1nds 2012-03-15
  • 打赏
  • 举报
回复
很简单,远程线程 freelibrary
Yofoo 2012-03-15
  • 打赏
  • 举报
回复
dllmain 里面DLL_PROCESS_ATTACH 判断进程, 不需要的返回FALSE

15,471

社区成员

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

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