再问一个问题,,,,不算太难,,,也不算太简单的~~

taoyi 2005-05-26 03:17:03
问题是这样的,我需要在目标进程中做一些操作,于是我向目标进程安装一个消息钩子将DLL注入目标进程,然后再将目标进程窗口的窗口函数地址修改为我的窗口函数地址,代码类似如下:

void SetHook()
{
g_hHook = SetWindowsHookEx(...); // 安装钩子注入代码
g_oldWndProc = SetWindowLong(.....,(LONG)MyProc); //修改目标窗口函数地址
}

LRESULT CALLBACK MyProc(......)
{
}

void UnHook()
{
if (g_oldWndProc != NULL)
SetWindowLong(.....,(LONG)g_oldWndProc);

if (g_hHook != NULL)
UnhookWindowsHookEx(g_hHook);
}

实际编写过程中发现已经成功完成想要执行的操作,但是问题出在卸载钩子的时候目标程序就异常退出了,而且总是这样异常退出,这是为什么呢??

在UnHook()过程中我是应该先卸载掉钩子还是先还原目标进程窗口函数????
...全文
146 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
taoyi 2005-05-31
  • 打赏
  • 举报
回复
可以了,,果然是旧的PROC保存出了点问题
san_huo 2005-05-27
  • 打赏
  • 举报
回复
可能是你旧的proc保存有问题,不要设成共享段变量啊。还有你用windbg调试一下目标进程,卸载钩子后窗口过程是不是改回去了
wangk 2005-05-27
  • 打赏
  • 举报
回复
我想可不可以让你的MyProc收到某个消息时,恢复原目标进程窗口函数,之后再卸载钩子?
wangk 2005-05-27
  • 打赏
  • 举报
回复
对了,你是不是只Hook 目标进程?
还有,退出进程时,你做了其他什么动作吗?
taoyi 2005-05-27
  • 打赏
  • 举报
回复
to san_huo(煽风点火) : 已经做了,可不见效果啊,还是崩溃~~~

to wangk(倒之) : 是我发贴的时候没注意到,我代码中本来的SetWindowLong是在WH_GETMESSAGE钩子函灵数中调用的,那个地址肯定是目标进程的地址了,不然所做的操作是根本不能成功的,但问题是一旦退出我的进程,目标进程就老崩啊~,郁闷中。。。。是啥原因呢?
wangk 2005-05-26
  • 打赏
  • 举报
回复
晕~~ 看错了。不好意思。
MyProc的地址是相对于你的调用进程的,所以SetWindowLong应该在钩子函数中调用。
即SetWindowsHookEx的Hook Proc 中调用,才能保证MyProc是相对于被替换进程的地址。
否则SetWindowLong设置的地址对被替换进程很可能是无效的。
wangk 2005-05-26
  • 打赏
  • 举报
回复
汗,将MyProc的声明改为
LRESULT CALLBACK MyProc形式
否则铁定异常,进程堆栈被破坏。
san_huo 2005-05-26
  • 打赏
  • 举报
回复
在DllMain中做好了 process attach的时候替换,detach的时候换回去
taoyi 2005-05-26
  • 打赏
  • 举报
回复
汗~~~为什么就不可以没有异常呢?
OnlyHappy 2005-05-26
  • 打赏
  • 举报
回复
不异常才怪

15,471

社区成员

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

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