首页
社区
课程
招聘
[求助]dll与exe通信问题疑问之二
发表于: 2015-3-1 22:10 5658

[求助]dll与exe通信问题疑问之二

2015-3-1 22:10
5658
这是上一篇帖子http://bbs.pediy.com/showthread.php?t=198240&highlight=

我照着xjj的代码敲了一边,有两点疑问,

1,在XP下可以正常注入,发消息可以弹MessageBox,但Win7下不好用
2,::PostMessage(hwnd,WM_HELLO,NULL,NULL);好用
     ::SendMessage(hwnd,WM_HELLO,NULL,NULL);不好用

以下是代码

exe中的

void CEXEDlg::OnBnClickedinstall()  //安装钩子按钮
{
  // TODO: 在此添加控件通知处理程序代码
  hwnd =::FindWindow(NULL,L"HOOK.txt - 记事本");
  InstallHook(hwnd);
}

void CEXEDlg::OnBnClickedbox()   //测试通信按钮
{
   // ::SendMessage(hwnd,WM_HELLO,NULL,NULL); Send怎么就不好用呢?
  ::PostMessage(hwnd,WM_HELLO,NULL,NULL);
}

void CEXEDlg::OnBnClickeduninstall()  //卸载钩子按钮
{
  UninstallHook();
}

dll中的

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)//钩子回调
{
  if(nCode==HC_ACTION)
  {
    LPMSG p=(LPMSG)lParam;
    if(p->message==WM_HELLO)
    {
      AfxMessageBox(L"Hello World!",0,0);
    }
  }
  return ::CallNextHookEx(hhook, nCode, wParam ,lParam);
}
HHOOK WINAPI InstallHook(HWND hwnd) //安装钩子
{
  DWORD pid=::GetWindowThreadProcessId(hwnd,NULL);
  hhook=::SetWindowsHookExW(WH_GETMESSAGE,(HOOKPROC)HookProc,theApp.m_hInstance,pid);

  if(hhook!=NULL)
  {
    return hhook;
  }
  return 0;
}
BOOL WINAPI UninstallHook() //卸载钩子
{

  return ::UnhookWindowsHookEx(hhook);
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 398
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
::PostMessage(hwnd,WM_HELLO,NULL,NULL);这个是进队消息;
::SendMessage(hwnd,WM_HELLO,NULL,NULL);这个是不进队消息;

也就是说你发送SendMessage消息给目标窗口后,目标窗口的消息循环中WH_GETMESSAGE并没有取到这个消息;
而目标窗口对于SendMessage给他的消息是由操作系统直接调该窗口的消息响应函数作出处理的;
2015-3-1 23:05
0
雪    币: 60
活跃值: (439)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
3
这个倒是知道,但是为啥取不到呢,还有win7为啥不好用呢
2015-3-2 06:37
0
雪    币: 60
活跃值: (439)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
4
重在参与,大家给点意见啊!~~
2015-3-2 09:27
0
雪    币: 60
活跃值: (439)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
5
畅所欲言啊,答错不要紧,大家踊跃发言啊~~~
2015-3-2 10:15
0
雪    币: 60
活跃值: (439)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
6
第二个问题解决了,原因是钩子类型错了
WH_GETMESSAGE对应的是PostMessage
WH_CALLWNDPROC这个才是截取SendMessage

还差第一个问题了。

WH_GETMESSAGE      =
3
;  
{
系统级或线程级
;
截获从消息队列送出的消息
}
  
WH_CALLWNDPROC     =
4
;  
{
系统级或线程级
;
截获发送到目标窗口的消息
,

SendMessage
调用时发生
}
2015-3-2 10:40
0
雪    币: 704
活跃值: (3360)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
7
安装完钩子之后查看一下目标进程模块,看dll注入进去了没
2015-3-3 09:37
0
雪    币: 60
活跃值: (439)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
8
是没住进去,我换个程序就注进去了,可能是记事本有什么特殊之处。
2015-3-3 09:40
0
雪    币: 704
活跃值: (3360)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
9
是不是32位dll和64位系统。。。
2015-3-3 19:04
0
雪    币: 60
活跃值: (439)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
10
大哥你真是太厉害了,一天解决我两个问题,确实是32位的DLL不好用,我编译成64位的就可以了,是不是因为win7x64的notepad是原生的64位程序所以不好用呢?
2015-3-3 23:40
0
雪    币: 60
活跃值: (439)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
11
我可以安心的睡了~
2015-3-3 23:57
0
雪    币: 704
活跃值: (3360)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
12
是的。按我目前了解到的,32的dll无法注入到64位进程,同样64的dll无法注入32位进程。
2015-3-4 09:18
0
游客
登录 | 注册 方可回帖
返回
//