大侠们,你们在哪呀??? ( 积分: 300 )

  • 主题发起人 主题发起人 YuZi
  • 开始时间 开始时间
Y

YuZi

Unregistered / Unconfirmed
GUEST, unregistred user!
我的目标是Hook Shell_NotifyIconA和Shell_NotifyIconW,通过WH_GETMESSAGE加载Hook API 模块。先请看下面的代码<br>//WH_GETMESSAGE处理过程<br>function GetMsgProc(nCode : Integer; &nbsp;wParam : WPARAM; lParam: LPARAM): LRESULT; stdcall;<br>begin<br> if (nCode = HC_ACTION) and (not TrayData^.Hooked) then<br> &nbsp;begin<br> &nbsp; HookAPI; //加载Hook API模块<br> &nbsp; DLLData^.Hooked := True;<br> &nbsp;end;<br><br> &nbsp;//调用下一个Hook<br> Result := CallNextHookEx(DLLData^.Hook, nCode, wParam, lParam);<br>end;<br>//安装WH_GETMESSAGE钩子<br>function InstallHook(aWnd : HWND):Boolean;stdcall;<br>var<br> &nbsp;ThreadID : DWORD;<br>begin<br> &nbsp;Result := False;<br> &nbsp;TrayData^.Hook := 0;<br> &nbsp;ThreadID := GetWindowThreadProcessId(aWnd, nil);<br> &nbsp;//给指定窗口挂上钩子<br> &nbsp;TrayData^.Hook := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, Hinstance, ThreadID);<br> &nbsp;if TrayData^.Hook &gt; 0 then //是否成功HOOK<br> &nbsp; Result := True;<br>end;<br><br> 用这种方法Hook某一窗口的Shell_NotifyIconA能成功,一切正常。(其实我的目的就是拦截程序添加、删除托盘图标的消息),但这样只能Hook一个窗口。<br> 后来我想到这样加载钩子:InstallHook(0); 试图Hook系统所有的窗口,发现确是可以Hook到,但却出现了几个致命的问题:<br> 1、启动Hook正常,Hook处理过程也正常,但在Delphi中关闭的项目时却出现了如下错误:“Access violation at address 06da7ec8. Read of address 06DA7EC8.”<br> 也无法打开新的项目了,只能退出Delphi,而且退出时还有几个错误对话框。<br> 2、有部分程序启动加截托盘图标HOOK不到,比如:网际快车、MSN,但这些软件退出时删除托盘的消息却可以HOOK到,起初怀疑那些软件是用Shell_NotifyIconW添加的托盘图标,后来也Hook了Shell_NotifyIconW函数,但仍旧HOOK不到,为什么?<br> 3、第一个问题最重要,如果有高手帮我写出有效代码,将得到300分或260分以上。
 
我的目标是Hook Shell_NotifyIconA和Shell_NotifyIconW,通过WH_GETMESSAGE加载Hook API 模块。先请看下面的代码<br>//WH_GETMESSAGE处理过程<br>function GetMsgProc(nCode : Integer; &nbsp;wParam : WPARAM; lParam: LPARAM): LRESULT; stdcall;<br>begin<br> if (nCode = HC_ACTION) and (not TrayData^.Hooked) then<br> &nbsp;begin<br> &nbsp; HookAPI; //加载Hook API模块<br> &nbsp; DLLData^.Hooked := True;<br> &nbsp;end;<br><br> &nbsp;//调用下一个Hook<br> Result := CallNextHookEx(DLLData^.Hook, nCode, wParam, lParam);<br>end;<br>//安装WH_GETMESSAGE钩子<br>function InstallHook(aWnd : HWND):Boolean;stdcall;<br>var<br> &nbsp;ThreadID : DWORD;<br>begin<br> &nbsp;Result := False;<br> &nbsp;TrayData^.Hook := 0;<br> &nbsp;ThreadID := GetWindowThreadProcessId(aWnd, nil);<br> &nbsp;//给指定窗口挂上钩子<br> &nbsp;TrayData^.Hook := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, Hinstance, ThreadID);<br> &nbsp;if TrayData^.Hook &gt; 0 then //是否成功HOOK<br> &nbsp; Result := True;<br>end;<br><br> 用这种方法Hook某一窗口的Shell_NotifyIconA能成功,一切正常。(其实我的目的就是拦截程序添加、删除托盘图标的消息),但这样只能Hook一个窗口。<br> 后来我想到这样加载钩子:InstallHook(0); 试图Hook系统所有的窗口,发现确是可以Hook到,但却出现了几个致命的问题:<br> 1、启动Hook正常,Hook处理过程也正常,但在Delphi中关闭的项目时却出现了如下错误:“Access violation at address 06da7ec8. Read of address 06DA7EC8.”<br> 也无法打开新的项目了,只能退出Delphi,而且退出时还有几个错误对话框。<br> 2、有部分程序启动加截托盘图标HOOK不到,比如:网际快车、MSN,但这些软件退出时删除托盘的消息却可以HOOK到,起初怀疑那些软件是用Shell_NotifyIconW添加的托盘图标,后来也Hook了Shell_NotifyIconW函数,但仍旧HOOK不到,为什么?<br> 3、第一个问题最重要,如果有高手帮我写出有效代码,将得到300分或260分以上。
 
我对这个没有太多的研究!<br>希望高手进来!<br>我也学习学习!
 
其他人都不要回答了算了,他只要麻子给他说。
 
晕,怎么这样说呢?<br>其实无论哪种说法,都只是希望得到更多人的关注罢了。。。
 
to moonight59:<br>为什么我要请麻子兄帮忙呢?一是因为我的问题没人关心,得不到别人的帮助;二是麻子兄真真切切地帮助我解决过很多难题,能力和人品值得信赖。难道指名请求别人帮助也有错,晕~~~~~~~~~<br>如果您真正帮助别人解决过难题,我想别人也会指名请求您帮忙的。。。。
 
自由界面和报表的完美解决方案!<br>http://www.anylib.com
 
楼上那个卖广告的猪,拉出去**了!
 
对这些无聊的广告全部封杀!!!
 
只有学习的份
 
我等~~~~~~~~~~~~~~~~~~~~
 
//2.有部分程序启动加截托盘图标HOOK不到<br>你可以使用PE工具比如PEExplorer来查看这些程序导入的API,看看是A/W那一个.这种HOOK方式必须在目标程序消息循环启动之后才会起作用.你可以使用调试器启动目标程序,并且暂停在入口点,之后在你的GetMsgProc中和ShellNxxx处中断,查看哪一个先被调用<br>//3.第一个问题最重要<br>同意<br>//1.启动Hook正常...<br>首先,你可以通过调试器查看发生异常的地址是在哪个代码部分[06da7ec8],使用use debug dcu应该有帮助.<br>其次,注意不要HOOK你自己的这个监控程序,还有退出的时候要UnHook.<br>再次,你自己先写一个仅仅是SetHOOK的APP和DLL,不要安装HOOK,看是否出错,然后再允许安装HOOK,但是在HOOK代码中屏蔽所有操作,看是否出错,然后打开HOOK代码中的操作,但是屏蔽APP/DLL之间的通信代码,看是否出错,然后打开你的监控程序中APP/DLL之间通信的代码.这样逐步判定,逐步升级,切忌刚开始没有经过任何调试就一股脑的把所有代码写出来
 
谢谢zjan521!<br>我说的第一个问题指的是Hook全部窗口的API产生错误的问题,用InstallHook()Hook一个窗口是不会产生错误的,所以我问题的关键是如何正常Hook 系统全部的窗口?也就是说我怀疑用InstallHook(0) 的方法Hook全部窗口的正确性。我想应该不是通过WH_CBT来捕捉新的窗口,再不断地InstallHook的方法来实现吧。。。。<br>有一款叫PSTrayFactory的窗口、托盘隐藏软件,能够做到实时捕获托盘图标的变化,比如:QQ当有好友消息时,托盘区的头像会闪动变化,该 软件就可以做到实时更新列表中的托盘图标。刚开始我怀疑它是用 Api Hook的方法实现,后来发现它可能只是Hook了托盘图标区窗口的消息,我们知道2000以上版本托盘图标其实就一个ToolBar上的按钮,我怀疑它是拦截了ToolBar增加、删除、改变按钮图标的消息,从而做到实时更新的。但具体实现方法我无从想像,如果有朋友能提供这方面帮助的话,我的问题也能得到解决。即:HOOK托盘ToolbarWindow32添加图标、删除图标、修改图标的消息。
 
不好意思,我只是看不惯这样的标题,顺便对麻子有点不满意,想他来的问题他老不来。<br>我又没跟他结怨。我也想他来关心的。
 
那个托盘本身就是一个TOOLBATR,你可以用SPY++获得如何得到此句柄的信息。<br>添加图标、删除图标对应的是TOOLBATR的ADDITEM,DELITEM<br>你可以参考[ ms-help://MS.MSDNQTR.2003FEB.2052/shellcc/platform/commctls/toolbar/reflist.htm ]这里边列出了对应的消息.<br>至于HOOK这些消息,太简单了吧.
 
to zjan521:<br>这个我知道,那些消息在 CommCtrl单元里都有,关键是说起来简单,做起来难,<br>特别是如何得到ToolBar的ImageList,从而知道被改变的图标句柄呢?再有那些都不是WM_开头的标准窗口消息,也就是说要拦截处理这些消息,就必须替换托盘窗口的窗口过程WndProc。我觉得挺难的,您能否给我做个演示呢?
 
SetWindowsHookEx,这个本来就是HOOK的正常的工作,而不是作为HookAPI的工具。<br>至于ImageList,这个倒是比较麻烦一些,因为HIMAGELIST这个并不是窗口句柄.我能想到的只能是HOOK ImageList_Replace等几个API.<br>用这个方法的好处是你只须要控制处理一个线程即可,要简单和容易处理的多.<br>并且如果你不想使用HOOK的话,也很容易,你可以使用CreateRemoteThread把你的DLL注入到EXPLORER.EXE中,然后在DLL中处理SetWindowLong子类化
 
谢谢zjan521,但具体实现我仍然不是很清楚。<br>SetWindowLong替换托盘区窗口过程后,已经可以拦截ToolbarWindow32消息的TB_BUTTONCOUNT之类消息了,但奇怪的是当托盘区增加一个图标时,竟然没有TB_ADDBUTTONS消息,删除托盘图标时倒是有TB_DELETEBUTTON消息,用SPY++得到的消息也一样?真是头大。。。。<br>还有托盘图标动画时,像QQ有消息时闪动头像,也没有相关TB消息,只是一大堆TB_BUTTONCOUNT。。。。<br><br>郁闷~~~~~~~难道都没有人写过这类程序???
 
TB_INSERTBUTTON//是不是这个。<br>还有.图像可能是放到了ImageList之中.我上边已经说了
 
没有TB_INSERTBUTTON,只有用PSTrayFactory隐藏/显示时才有该消息。<br>我知道是ImageList,也能够取得其Handle,但在程序中用ImageList_GetIcon无法取到图标。想来应该是要在子类过程中用这些函数才有效。<br>如果添加托盘图标没有TB_ADDBUTTON消息的话,那拦截这些消息就实在没有什么意义了。。。。<br>晕,这些高手~~~~~~~~不愿帮我~~~~~~~~~~~~~~~好难过。。。。
 
后退
顶部