zxWraith的窝
dotnet,Warcraft and life!

写了一个简单的Demo,做完后发现一个问题,开始想了很久:
两个模块:
exe:
main()
{
    启动目标进程(一个记事本程序);
    导入dll;
    执行dll中的sethook;
    Free掉dll;

}

dll;
Export sethook(dwThreadid)
{
    SetWindowsHookEx(目标线程);
    *
}

程序本身没什么问题,但是执行的时候发现dll没有挂接上去,开始觉得是SetWindowsHookEx没有成功,后来发现返回值非0,很郁闷~
并且有时候执行可以挂接,有时候不行~,自己感觉完全被弄晕了...
后来无意中调试的时候在*处设个断点,并且点了一下记事本,发现dll挂上去了!心里十分激动,后来仔细想想,发现了问题所在:
由于windows是消息驱动的,虽然main中sethook了目标进程,并且也成功了,但是在sethook和FreeLibrary之间并没有给目标进程一个消息(hook的机制就是基于消息的)导致虽然hook成功,但是dll并没有挂接.把代码这样改一下就万无一失了:
Export sethook(dwThreadid)
{
    SetWindowsHookEx(目标线程);
    ::PostThreadMessage(dwThreadId,WH_GETMESSAGE,NULL,NULL);
}
有时间把windows的内部研究一下~,以后才能熟练运用~

posted on 2006-04-16 19:33  zxWraith  阅读(694)  评论(1编辑  收藏  举报