三级跳的困惑(25分)

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

sy0116

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用三级跳来隐藏进程,写了一个EXE来调用Jump.dll再用jump.dll来调用Project1.dll,EXE得到Explorer.exe的PID并且将其传到Jump.dll的Load过程,load是这样写的:<br>=======================================================================================<br>procedure Load(ExpID:THandle);stdcall;export;<br>begin<br> &nbsp;ExpHook:=SetWindowsHookEx(WH_GETMESSAGE,@LoadP,HInstance,ExpID);<br> &nbsp;if GetCurrentThreadId=ExpID then<br> &nbsp;MessageBox(0,'dd',pChar(IntToStr(ExpID)),0);<br>end;<br>=======================================================================================<br><br>LoadP是这样写的:<br>=======================================================================================<br>type<br> &nbsp;Hook=function:Boolean;stdcall;<br><br>function LoadP(ncode,wparam,lparam:Integer):Integer;stdcall;<br>var<br> &nbsp;Phd:THandle;<br> &nbsp;Shook:Hook;<br> &nbsp;Pid:DWORD;<br>begin<br> &nbsp;Phd:=LoadLibrary('Project1.dll');<br> &nbsp;Shook:=GetProcAddress(Phd,'SetHook');<br> &nbsp;CreateThread(nil, 0, @SHook, nil, 0,Pid);<br> &nbsp;Result:= CallNextHookEx(ExpHook,ncode,wparam,lparam);<br>end;<br>=====================================================================================<br>程序运行后通过第一次跳出的对话框得知PID是正确的,但是,随后就不断地跳出系统错误提示:Explorer.exe错误之类的东西,直到EXE退出。<br>请问这是为什么?应该如何解决?
 
win2k sp3 以后好像ms就打了explorer的防远程注入补丁,这玩意不行了,得换个方法
 
我的是XP SP2,不用Explorer.exe用其他的进程也一样,应该是钩子重复调用的问题,不知如何才能保证只调用一次
 
改成这样也不行,虽然没有错误了,但运行时根本没反应,应该是因为GetCurrentThreadId不等于NID,请问应该如何解决<br><br>function LoadP(ncode,wparam,lparam:Integer):Integer;stdcall;<br>var<br> &nbsp;Phd:THandle;<br> &nbsp;Shook:Hook;<br> &nbsp;Pid:DWORD;<br>begin<br> &nbsp;Result:= CallNextHookEx(ExpHook,ncode,wparam,lparam);<br> &nbsp;if (ncode&gt;=0) and (GetCurrentProcessIdd=NID) then<br> &nbsp;begin<br> &nbsp; &nbsp;Phd:=LoadLibrary('Project1.dll');<br> &nbsp; &nbsp;Shook:=GetProcAddress(Phd,'SetHook');<br> &nbsp; &nbsp;CreateThread(nil, 0, @SHook, nil, 0,Pid);<br> &nbsp;end;<br>end;<br><br>procedure Load(ExpID:THandle);stdcall;export;<br>begin<br> &nbsp;NID:=ExpID;//ExpID是Explorer.exe的PID<br> &nbsp;ExpHook:=SetWindowsHookEx(WH_GETMESSAGE,@LoadP,HInstance,0);<br>end;<br><br>三级跳搞了2天了,一点办法都没有,改了N次,网上找的很多资料都不清楚,有的就太复杂了,看得头昏眼花还没弄懂,请各位高手帮帮忙啦
 
不可能 我在XP SP2下可以注入Explorer.exe而且我的还是四级跳呢<br>EXE-&gt;注入DLL-&gt;注入代码DLL-&gt;键盘HOOK DLL
 
麻烦楼上的朋友看看到底哪儿出问题了?
 
我在网上找了个可用的代码,但那个功能太多了,有很多看不懂的地方,我按我自己对三级跳的理解照他的改了一下,可就是不行。<br>我对三级跳的理解是这样的,由于我对其他的一些基础知识不是很了解,不知道对不对,请各位高手指教:<br>先用自己的EXE挂一个系统钩子,并且把Explorer.exe的PID传给中间DLL,<br>ExpHook:=SetWindowsHookEx(WH_GETMESSAGE,@LoadP,HInstance,0);<br>挂上系统钩子后,中间DLL就被映射到所有进程(包括Explorer.exe)中去了,然后中间DLL在通过GetCurrentProcessId来确定自己现在所属的进程的PID(此时中间DLL已被注入到所有进程中去了),如果GetCurrentProcessId返回的值和EXE传来的PID相同就创建一个线程,这个线程中调用我所需要的DLL(第二DLL),然后第二DLL中的函数就能和直接用EXE调用一样正常运行了
 
pid应该为GetWindowThreadProcessId的返回值.可以自己测试比较一下.如果确定无误的话,可以这样改着试试看.<br>procedure SHook; stdcall;<br>var<br>......<br>begin<br> &nbsp;Phd:=LoadLibrary('Project1.dll');<br> &nbsp;Shook1:=GetProcAddress(Phd,'SetHook');<br> &nbsp;Shook1;<br>end;<br><br>function LoadP(ncode,wparam,lparam:Integer):Integer;stdcall;<br>var<br> &nbsp;Phd:THandle;<br> // Shook:Hook;<br> &nbsp;Pid:DWORD;<br>begin<br><br> &nbsp;CreateThread(nil, 0, @SHook, nil, 0,Pid);<br> &nbsp;Result:= CallNextHookEx(ExpHook,ncode,wparam,lparam);<br>end;
 
改称这样也没用,请看http://www.delphibbs.com/delphibbs/dispq.asp?lid=3548359<br>找到了一个解决办法,但不知为什么
 
多人接受答案了。
 
后退
顶部