CreateProcess创建出来的进程无法用SetWindowsHookEx勾住?

wsxqaz 2010-03-07 10:31:05
CreateProcess最后一个参数PROCESS_INFORMATION中得到dwThreadId然后用这个ID去SetWindowsHookEx但是好象没有勾到?
...全文
357 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
q254021663 2012-07-15
  • 打赏
  • 举报
回复
WaitForInputIdle用这个来等待那个进程初始化。
q254021663 2012-07-15
  • 打赏
  • 举报
回复
我来回答你这个问题吧,在你的hook程序中,在SetWindowsHookEx之前加上Sleep(一段时间)绝对可以hook得到。为什么没有第一时间hook到,我也在找这个问题。
wsxqaz 2010-03-09
  • 打赏
  • 举报
回复
引用 9 楼 lhcwjy 的回复:
你要钩别的进程,钩子函数必须在dll中,theApp.m_hInstance,要设为dll的句柄


我想问一下我该如何通过dwProcessId得到HINSTANCE呢?用OpenProcess可以得到HANDLE这个HANDLE如何得到HINSTANCE呢?
maoenpei002 2010-03-09
  • 打赏
  • 举报
回复
正打算写一个关于钩子的文章,顺便说一点可能对你有点帮助的东西,不一定就是你的问题的答案。
钩子的原理是把调用钩子的DLL映射到所有需要被钩的进程的进程地址空间里面,这样当满足钩子条件的事件触发的时候会调用你传递给钩子的一个回调函数。
所以不可能吧SetWindowsHookEx放在Exe中,因为虽然是完全相同的PE格式但是exe和dll还是有本质区别的,exe无法被映射到其它进程的地址空间。
dll相当于代码的共享,就像文件映射方式能够共享内存一样,是跨进程的,都是为了节省内存而设计的一种模式,但是需要注意的是逻辑上认为dll除了代码什么都没有,它所开辟的内存空间都是在这个dll被映射到进程地址空间中之后进程的一个线程所开辟的空间。(详细的解释参见《windows核心编程》)

至于你说需要传递的那个参数,因为dll映射到了地址空间的哪里这个是不确定的,所以要找到映射的基地址,再通过函数的地址偏移量计算出需要调用的函数地址,所以要找到的是dll映射的基地址(第一个4字节,如果是32位计算机的话)。可以通过GetModuleHandle或者GetModuleHandleEx函数来确定映射地址,传递给他的参数是你的dll的名字,当然,如果希望代码做尽量少的修改,最好不要修改dll名字,如果是希望知道exe的映射基地址,则可以有另外的方法来获得,不需要写入固定的exe名称。
白云飘飘飘 2010-03-08
  • 打赏
  • 举报
回复
你要钩别的进程,钩子函数必须在dll中,theApp.m_hInstance,要设为dll的句柄
wsxqaz 2010-03-08
  • 打赏
  • 举报
回复
引用 7 楼 bilaopao 的回复:
记事本也HOOK成功?你用冰刃看过钩子?


你的意思是记事本无法hook住?

我去hook自己写的exe也勾不住啊


CreateProcess(NULL,CString2TCHAR(openDlg.GetPathName()),NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);

SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)HookProc,theApp.m_hInstance,pi.dwThreadId);
bilaopao 2010-03-08
  • 打赏
  • 举报
回复
记事本也HOOK成功?你用冰刃看过钩子?

引用 6 楼 wsxqaz 的回复:
引用 5 楼 bilaopao 的回复:为什么你不发错误信息?

没有错误信息,一切都很正常的跑完了就是无法hook住打开的记事本的键盘消息
wsxqaz 2010-03-08
  • 打赏
  • 举报
回复
引用 5 楼 bilaopao 的回复:
为什么你不发错误信息?


没有错误信息,一切都很正常的跑完了就是无法hook住打开的记事本的键盘消息
oldn123 2010-03-08
  • 打赏
  • 举报
回复
这个得看目标进程是什么进程,还有你参数是怎么写的
wsxqaz 2010-03-08
  • 打赏
  • 举报
回复
非常的急,顶起来,等回复,大家来帮忙啊
bilaopao 2010-03-08
  • 打赏
  • 举报
回复
为什么你不发错误信息?
wsxqaz 2010-03-08
  • 打赏
  • 举报
回复
顶起来,大家帮忙看看
wsxqaz 2010-03-08
  • 打赏
  • 举报
回复
引用 2 楼 oldn_cc_bird 的回复:
这个得看目标进程是什么进程,还有你参数是怎么写的


我用CreateProcess打开了一个记事本,然后用SetWindowsHookEx去勾这个记事本,但是勾不到。而且我好象只能勾到全局事件就是SetWindowsHookEx最后一个参数是0的到是正常的

16,472

社区成员

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

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

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