德尔福,我的嗅探器不适用于WLAN

时间:2012-11-16 12:00:01

标签: delphi sockets network-programming winsock packet-sniffers

我有一个用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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

您绑定到第一个可用的本地IP(BTW,请勿使用gethostbyname()枚举本地IP,因为无法保证返回正确的值。使用GetAdaptersInfo()或{{3而不是)。如果计算机安装了多个IP,则可能绑定到错误的IP。在这种情况下,您应该让用户选择要绑定的IP。