如何侦听本机发送的所有网络数据包?(100分)

  • 主题发起人 主题发起人 解元
  • 开始时间 开始时间

解元

Unregistered / Unconfirmed
GUEST, unregistred user!
要侦听发送到本机的网络包已经知道了:
SIO_RCVALL = IOC_IN or IOC_VENDOR or 1 ;
WSAIoctl(s, SIO_RCVALL, @OptVal, SizeOf(OptVal),nil,0, @OptRet, nil, nil);
但是如何侦听本机发送出去的所有网络数据包呢?
能回答的100分相送!
 
呵呵,这方法就已经是进出通吃了。
 
进来的是Ret:=recv(s, Buf, BufSize, 0);
那么出去的怎么写?看来LeeChange大虾是知道的了?
 
出去的包也会被
Ret:=recv(s, Buf, BufSize, 0);
抓住的,一个也少不了。
 
LeeChange
知道怎么拦截吗?
 
ZeroMemory(@Buf, BufSize);
Ret:=recv(s, Buf, BufSize, 0);
if Ret=SOCKET_ERROR then
begin
ShowMessage('recv failed with error '+IntToStr(WSAGetLastError));
IPHeaderLen:=(IPHeader.VerLen and $F)*4;
TCPHeader:=PTCP_HDR(@Buf[IPHeaderLen]);
end;
if check then exit;

IPHeader:=PIPv4_HDR(@Buf[0]);
IP:=IntToIpStr(IPHeader.SrcAddr);
if (IPHeader.Protocol=IPPROTO_TCP) then
begin
IPHeaderLen:=(IPHeader.VerLen and $F)*4;
TCPHeader:=PTCP_HDR(@Buf[IPHeaderLen]);
TCPHeaderLen:=(ntohs(TCPHeader.LenFlag) shr 12)*4;
Data:=@Buf[IPHeaderLen+TCPHeaderLen];
Memo1.Lines.Append('Recv From:'+IntToIpStr(IPHeader.SrcAddr)+',Port:'+Inttostr(TCPHeader.SrcPort));
Memo1.Lines.Append(BufferToHex(Data,ret - IPHeaderLen - TCPHeaderLen));
Memo1.Lines.Append('---------------------------------------------------');
end;

没看到我的地址发出去的包。
 
to wlmmlw:
如果只从网络层考虑,对于TCP,可以在得到一发出的ack,根据它算出下一个要的seq,冒充他的peer发一个rst给他。对于UDP,偶也想不出什么办法。
如果从链路层考虑,可以发个假的arp应答,让被拦截的机器找不到目标机器或者找不到网关。但win下编链路要装winpcap,不如linux下方便。
 
to 楼主:
偶不知道if check是何用意。
ps:这代码怎么这么熟悉呀。
 
这段代码本来就是这个论坛里一个贴子里看到的。
if check then exit是说“如果选择了不监听”就退出去不处理。要不然memo1刷屏太快看不清啊。
 
to 解元:
你先拿偶的程序(原版,不要加自己的改动)运行试试,如果也找不到发出的包,偶再研究。
 
http://www.2ccc.com/article.asp?articleid=916
 
LeeChange大虾:
原来那段代码就是LeeChange大虾的啊?失敬!不过你的原版的代码还是没有看到从本地发出的任何消息啊。从 刘麻子 大虾提供的地址下栽的程序运行结果也没有看到本地地址(到是看到了许多源地址和目标地址都不是本地地址的消息,不知道这是否就是别人的消息?)
 
偶的代码只监听1863端口,你把关于端口的判断语句去掉试试。
 
好呀,正是我想知道的
我想做边锋作弊器
 
不行啊,一样的,只有别人给我发的,没有我给别人发的。
用来自:刘麻子, 时间:2004-6-2 11:20:23, ID:2640882
http://www.2ccc.com/article.asp?articleid=916
那个以你的原理编写的测试,也是没有的,看来是原理的问题。
是否是
if WSAAsyncSelect(s, Handle, WM_Socket, FD_READ)=SOCKET_ERROR then
应该是if WSAAsyncSelect(s, Handle, WM_Socket, FD_READ or FD_WRITE)=SOCKET_ERROR then
但是这样改过之后,刚运行的时候WMSocket(var Msg: TMessage)会出一个错误,结果也只是能侦听收不能侦听发。
另外,WSAIoctl(s, SIO_RCVALL, @OptVal, SizeOf(OptVal), nil, 0, @OptRet, nil, nil)的第5第6个参数应该是发送缓冲,这里没有设置,是否与这个有关?
 
需要你详细的运行环境,越详细越好。
 
运行环境:
硬件就不说了,肯定是那种普通的兼容机。
软件是WinXp Pro,没有Sp1
网络环境就是通过一个HUB接到交换机,再由另一台接到交换机上的机器上网的。
 
用hub的可以监听到别人的IP包,这是情理之中的。
至于发送的包收不到,可能是xp的原因吧,现在偶用的是2k pro,晚上回家试试吧,家里有xp pro.
 
后退
顶部