0

我有一个工作嗅探器程序,用 Delphi 编写。它在局域网中很好。但是当我的计算机在 WLAN 上时,它不会记录任何内容。初始化:

 if (WSAStartup(MAKEWORD(2,2), Wsa) <> 0) then ErrorMsg ('WSAStartup');

 //Create a RAW Socket
 sniffer:= socket(AF_INET, SOCK_RAW, IPPROTO_IP);
 if (sniffer = INVALID_SOCKET) then ErrorMsg ('Socket');

 //Retrive the local hostname
 getmem (hostname, 100);
 if (gethostname(hostname, 100) = SOCKET_ERROR) then ErrorMsg ('Gethostname');

 //Retrive the available IPs of the local host
 local:= gethostbyname(hostname);
 if (local = nil) then ErrorMsg ('Gethostbyname');
 i:= 0;
 repeat
  i:= i + 1;
  Move (local^.h_addr^[i-1], Addr, sizeof(Tinaddr));
 until (local^.h_addr^[i-1] <> #0);

 Players.MyIP:= inet_ntoa(Addr);
 if Players.MyIP = '0.0.0.0' then
        begin
         Showmessage ('No IP!?'); halt;
        end;
 _in:= 0;
 FillChar (Dest, SizeOf(Dest), 0);
 Move (local^.h_addr^[_in], dest.sin_addr.s_addr, sizeof(dest.sin_addr.s_addr));
 dest.sin_family:= AF_INET;
 dest.sin_port  := 0;

 if (bind(sniffer, @dest, sizeof(dest))) = SOCKET_ERROR then ErrorMsg ('Bind');

 j:= 1;
 if (WSAIoctl(sniffer, SIO_RCVALL, @j,4, nil, 0, LPDWORD(@_in),nil, nil)) = SOCKET_ERROR then ErrorMsg ('WSAIoctl');

捕获线程

 while not Terminated do
 begin
  mangobyte:= recvfrom (sniffer,Buffer^,65536,0,nil,nil); //Eat as much as u can
  if (mangobyte > 0) then
  begin
   adsasdasd
  end

所以它不会记录任何东西。我错过了什么吗?

4

2 回答 2

3

我想WLAN是指WiFi。以太网 (LAN) 数据包采用 802.3 格式,WiFi 数据包采用 802.11 格式。我不确定您的嗅探器到底在做什么,但是解析 802.3 帧与解析 802.11 帧不同。Windows XP 和更早的版本不支持原生 WiFi,因此驱动程序必须使用 802.3 标头包装无线数据包以模拟以太网 (LAN) 数据包。从 Vista 开始,不需要包装,操作系统直接处理 802.11 帧。除非您使用 WinXP 或更早版本,否则您需要对无线帧进行不同的解析。

于 2012-11-16T12:09:30.227 回答
2

您正在绑定到第一个可用的本地 IP(顺便说一句,不要gethostbyname()用于枚举本地 IP,因为不能保证返回正确的值。请改用GetAdaptersInfo()GetAdaptersAddresses())。如果机器安装了多个 IP,您可能绑定到了错误的 IP。在这种情况下,您应该让用户选择要绑定的 IP。

于 2012-11-16T20:55:53.703 回答