2012-11-16 64 views
0

我有一個工作嗅探器程序,用Delphi編寫。它在局域網中很好。但是當我的電腦在WLAN上時,它不會記錄任何東西。初始化:德爾福,我的嗅探器不會在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 

所以它不會記錄任何東西。我錯過了什麼嗎?

回答

3

我想通過WLAN你的意思是WiFi。以太網(LAN)數據包採用802.3格式,WiFi數據包採用802.11格式。我不確定你的嗅探器究竟做了什麼,但是解析802.3幀與解析802.11幀不同。 Windows XP和更早版本不支持本地WiFi,因此驅動程序必須使用802.3頭封裝無線數據包以模擬以太網(LAN)數據包。從Vista開始,不需要換行,操作系統直接處理802.11幀。除非您使用WinXP或更早的版本,否則您需要對無線幀進行不同的解析。

2

您正在綁定到第一個可用的本地IP(順便說一下,不要使用gethostbyname()來枚舉本地IP地址,因爲它不能保證返回正確的值,請改爲使用GetAdaptersInfo()GetAdaptersAddresses())。如果機器安裝了多個IP,則可能會綁定到錯誤的IP。在這種情況下,您應該讓用戶選擇要綁定的IP。