0

Delphi로 작성된 스니퍼 프로그램이 있습니다. 그 LAN에 좋은. 그러나 내 컴퓨터가 WLAN에있을 때 아무 것도 기록하지 않습니다. 초기화 :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 

것은 그래서 늘 아무것도를 기록합니다. 내가 놓친 게 있니?

답변

3

무선 랜을 사용한다고 가정합니다. 이더넷 (LAN) 패킷은 802.3 형식이며, WiFi 패킷은 802.11 형식입니다. 스니퍼가 정확히 무엇을하고 있는지 잘 모르겠지만 802.3 프레임의 구문 분석은 802.11 프레임의 구문 분석과 다릅니다. Windows XP 및 이전 버전은 기본 WiFi를 지원하지 않으므로 드라이버는 802.3 헤더로 무선 패킷을 래핑하여 이더넷 (LAN) 패킷을 에뮬레이트해야했습니다. Vista에서 시작하여 랩핑이 필요없고 OS가 802.11 프레임을 직접 처리합니다. WinXP 이전 버전으로 작업하지 않는 한 무선 프레임에 대해 다른 구문 분석이 필요합니다.

2

당신은 첫 번째 사용 가능한 로컬 IP (BTW, 적절한 값을 반환 보장되지 않는 지역 IP를 열거 할 gethostbyname()를 사용하지 않습니다. 대신 GetAdaptersInfo() 또는 GetAdaptersAddresses()를 사용)에 결합된다. 컴퓨터에 여러 개의 IP가 설치된 경우 잘못된 IP에 바인딩되어있을 수 있습니다. 이 경우 사용자가 바인딩 할 IP를 선택하도록해야합니다.