拦截其它程序的网络数据封包[转贴](0分)

  • 主题发起人 主题发起人 Txing
  • 开始时间 开始时间
T

Txing

Unregistered / Unconfirmed
GUEST, unregistred user!
难得一个代码不是VC的。<br>刚找到,有兴趣的试试看能否截获封包数据。<br>http://www.csdn.net/develop/Article/22/22765.shtm<br>
 
有人试了吗?
 
试了试,确实能截获封包了!<br>但不知怎样才能把截获的数据存入文件? <br><br>function MyRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;<br>var<br>&nbsp; dwSize: cardinal;<br>begin<br>&nbsp; //这儿进行接收的数据处理<br>&nbsp; MessageBeep(1000); &nbsp; &nbsp; &nbsp; &nbsp; //简单的响一声<br>&nbsp; //调用直正的Recv函数<br>&nbsp; WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize);<br>&nbsp; Result := OldRecv(S, Buf, len, flags);<br>&nbsp; JmpCode.Address := @MyRecv;<br>&nbsp; WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize);<br>end;<br>
 
function MyRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;<br>var<br>&nbsp;dwSize: cardinal;<br>&nbsp;tmp:str;<br>&nbsp;myfile:textfile;<br>begin<br>&nbsp;//这儿进行接收的数据处理<br>&nbsp; setlength(tmp,len);<br>&nbsp; move(buf,tmp[1],len);<br>&nbsp; AssignFile(myfile,'D:/hookapi/封包.txt');<br>&nbsp; Append(myfile);<br>&nbsp; Writeln(myfile,tmp);<br>&nbsp; CloseFile(myfile);<br>&nbsp;MessageBeep(1000); &nbsp; &nbsp; &nbsp; &nbsp; //简单的响一声<br>&nbsp;//调用直正的Recv函数<br>&nbsp;WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize);<br>&nbsp;Result := OldRecv(S, Buf, len, flags);<br>&nbsp;JmpCode.Address := @MyRecv;<br>&nbsp;WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize);<br>end;<br>
 
又如何才能在主窗口中显示截获的数据呢?<br>
 
在自己建立的主窗口吗?<br>还有,我的RECV怎么不能截获封包,只有SEND可以,你行吗?
 
&nbsp;ws2_32.dll 和 wsock32.dll 都试试,应该可以。<br><br>&nbsp; &nbsp;但我不知怎样能在exe窗口中显示截获的数据?<br>&nbsp; &nbsp;<br>
 
Txing,:<br>我执行到<br>&nbsp; if InstallHook(FindWindow(nil,<br>&nbsp; &nbsp; ShowMessage('Hook OK');<br>就出错,<br>access violation address 00000000,read of address 00000000
 
没出现你说的情况,你再检查一下。<br>现在虽然可以截获封包,但不知怎么在主窗口(exe)中显示截获的数据,只好存入文件。<br>你是怎么做的?<br><br><br>&nbsp;if InstallHook(TmpWndHandle) then<br>&nbsp; &nbsp;ShowMessage('Hook OK');<br>
 
难道是我的系统的问题?<br>我连点击 unhook 都出错。出错的信息与上面是一样的。<br><br>//但不知怎么在主窗口(exe)中显示截获的数据<br>你指的是用16进制方式显示出来吗?如:<br>00 01 0E 之类的。
 
你有没有指定窗口啊,我用传奇试的,能截获SEND,不能截获RECV,另外有没有兴趣研究一下传奇SQL版的原代码,我看了,缺一个PAS文件,其他没问题,有兴趣的请和我联系,QQ:247089
 
我unhook也一样出错! <br><br>procedure UnHookAPI;<br>var<br>&nbsp; dwSize: Cardinal;<br>begin<br>&nbsp; WriteProcessMemory(ProcessHandle, AddSend, @OldProc[0], 8, dwSize);<br>&nbsp; WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize);<br>end;<br><br>function MyRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;<br>var<br>&nbsp; dwSize: cardinal;<br>begin<br>&nbsp; //这儿进行接收的数据处理<br>&nbsp; MessageBeep(1000); &nbsp; &nbsp; &nbsp; &nbsp; //简单的响一声<br>&nbsp; //调用直正的Recv函数<br>&nbsp; WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize);<br>&nbsp; Result := OldRecv(S, Buf, len, flags);<br>&nbsp; JmpCode.Address := @MyRecv;<br>&nbsp; WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize);<br>end;<br><br>&nbsp; 我想可能是这样:在unhookapi时,刚好又MyRecv或MySend会怎样呢? 错可能就是由此引起! 不知对不对?<br><br>//你指的是用16进制方式显示出来吗?<br>我是想问:如何能将截获的数据传递给调用DLL的程序,也就是在我的exe中如何知道有封包发送并将其数据显示出来?<br><br><br>&nbsp;<br>&nbsp; &nbsp;<br>
 
把HOOKAPI包含进你自己的程序里啊
 
怎么做?<br><br>
 
to:txing<br>一定要installhook成功才能执行unhook,不然就会出错!<br>如果没有installhook成功@OldProc[0]为空
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
922
SUNSTONE的Delphi笔记
S
后退
顶部