难道只有用内存映像来解决吗?(15分)

  • 主题发起人 主题发起人 sy0116
  • 开始时间 开始时间
S

sy0116

Unregistered / Unconfirmed
GUEST, unregistred user!
还是老三级跳的问题,用下面代码把中间DLL注入到指定进程中去之后发现总是跳出对话框标题为f,内容为空,而如果在SetHook过程中加上一句MessageBox(0,DllPath,'f',0);则可以正确显示路径,请问这种情况下只能用内存映像文件来传递数据了吗?<br><br>procedure Load;<br>var<br> &nbsp;LibHd:THandle;<br>begin<br> &nbsp;Jumped:=True;<br> &nbsp;LibHd:=LoadLibrary(DllPath);<br> &nbsp;RealDLL:=GetProcAddress(LibHd,'SetHook');<br> &nbsp;if @RealDLL&lt;&gt;nil then<br> &nbsp;RealDLL<br> &nbsp;else<br> &nbsp;begin<br> &nbsp; &nbsp;MessageBox(0,DllPath,'f',0);<br> &nbsp; &nbsp;FreeLibrary(LibHd);<br> &nbsp;end;<br>end;<br><br>function JumpProc(ncode:Integer;wparam:WPARAM;lparam:LPARAM):LRESULT;stdcall;<br>var<br> &nbsp;pid:Cardinal;<br>begin<br> &nbsp;if Jumped=False then<br> &nbsp;begin<br> &nbsp; &nbsp;ThreadHd:=CreateThread(nil,0,@Load,nil,0,pid);<br> &nbsp; &nbsp;Jumped:=True;<br> &nbsp;end;<br> &nbsp;Result:=CallNextHookEx(JumpHook,ncode,wparam,lparam);<br>end;<br><br>procedure SetHook(ExpID:DWORD;Path:PChar);stdcall;<br>begin<br> &nbsp;DllPath:=PChar(Path+'key.dll');<br> &nbsp;JumpHook:=SetWindowsHookEx(WH_GETMESSAGE,@JumpProc,HInstance,ExpID);<br> &nbsp;//MessageBox(0,DllPath,'f',0);在这里显示正确<br> &nbsp;Jumped:=False;<br>end;
 
学习一下,帮你顶一下
 
我也学习一下.
 
试试Wm_copydata,但是好像只能传输简单的数据类型
 
WM_COPYDATA能够实现发送消息给DLL吗?在DLL中的确可以发送WM_COPYDATA给有窗体的DLL,但问题是现在要DLL发消息给DLL,应该如何实现呢?<br>这个问题的主要矛盾我认为应该在这了:<br>在SetHook过程中显示的对话框中的路径正确,这说明DllPath本身是没有问题的,但是,执行了SetWindowsHookEx之后这个DLL就被注入到其他的进程中去了,而DllPath这个全局变量却是在还没有被注入之前被赋值的,注入后的DLL所属的线程中的DllPath就相当于一个没有赋值的变量,所以是空值。但这样理解似乎也有问题,因为在SetHook中<br>MessageBox(0,DllPath,'f',0);<br>这一句是写在SetWindowsHookEx后面的,按理说执行了SetWindowsHookEx后的DLL就已经被注入了啊,但为什么这里的DllPath却仍然正确呢?<br>如果一定要用内存映像文件我还不如去用写注册表的方法,反正就一个小数据要传递,也慢不了多少
 
一般钩子程序都是把得到的数据传给挂钩子的程序的,像金山词霸、防火墙等,用WM_COPYDATA是可以实现的,只要接收的程序有消息循环就行<br>另外我觉得sy0116兄对挂钩DLL的运行情况不太了解,<br>当DLL被注入后并不影响挂接钩子的进程内的DLL,它们是两个映象,你挂的消息处理函数JumpProc才是真正运行挂接的进程内的,它的代码都是运行在你挂接的进程内的包括它调用的函数等,明白吗? 我说的可能太乱了,唉!表达能力太差啦~~~~~~~~~
 
WM_COPYDATA消息的使用在MSDN里有,还有一个钩子的小例子,很有代表性的
 
楼上说的不错,我已经明白了<br><br>我知道可以用WM_DATACOPY消息来实现DLL和主程序之间的数据传递,但我仅知道从DLL传数据给主程序的方法,主程序如何用WM_COPYDATA给DLL传数据呢?而且这里也不是主程序和DLL之间的数据交换,是DLL中的数据传递,能用WM_COPYDATA吗?
 
我对SetWindowsHookEx函数的理解是这样的:<br>JumpHook:=SetWindowsHookEx(WH_GETMESSAGE,@JumpProc,HInstance,ExpID);为例:<br>这个函数的作用是告诉(让)系统,所有发送到ExpID进程的WH_GETMESSAGE类消息,都先经函数JumpProc处理(或者说先发送到这个函数).<br>同时我认为这个函数还有一个作用,就是将函数JumpProc所在的DLL模块,映射(注入)到ExpID进程当中.也就是说&quot;当DLL被注入后并不影响挂接钩子的进程内的DLL,它们是两个映象&quot;:你的主调用程序,目标程序都调用了key.dll,在两个程序进程中,都有一个互不相干的key.dll的映像.<br>因此,<br>&quot;MessageBox(0,DllPath,'f',0);<br>这一句是写在SetWindowsHookEx后面的&quot;,这一句虽然是DLL注入之后,但该句代码依然是在主调用程序的进程当中执行的.所以就算没有共享内存映像,也可以正确.因为 过程SetHook里面<br>DllPath:=PChar(Path+'key.dll');和<br>&quot;MessageBox(0,DllPath,'f',0);<br>这两句,根本就是同一个进程内的代码.<br>上面的分析相当一部份只是帮ypynetboy 表达一下,不知道这样表达是否正确,能否理解.<br><br>个人感觉,进程间通讯,还是共享内存简单稳定.其它方法肯定存在.
 
谢谢楼上解释
 
sy0116兄,我明白你的意思了,昨天没看你的代码<br>其实主要的原因是因为你的Load线程是在被注入代码的进程内运行的,而在这个进程内的DLL映象并没有初始化DllPath变量,被注入代码的进程内的LSetHook函数没有被调用<br>如果要实现的话你可以试试向你挂接的线程发WM_DATACOPY消息,你JumpProc会先收到这个消息,然后用得到的数据给DllPath赋值就可以了,不过要注意赋值和线程Load调用的顺序
 
接受答案了.
 
后退
顶部