Simple sniffer, promisc mode.

Just starting out? Need help? Post your questions and find answers here.
Machiavelli
User
User
Posts: 26
Joined: Sun May 24, 2009 2:38 pm

Simple sniffer, promisc mode.

Post by Machiavelli »

Code: Select all

; Sniffer (C) SAM 2008 

EnableExplicit 

#SIO_RCVALL=$98000001 
#WSA_VER = $202 
#MAX_BUFF=$10000 

;-ip заголовок RFC 791 
Structure IPHeader 
    iph_verlen.b  ; версия и длина заголовка 
    iph_tos.b     ; тип сервиса 
    iph_length.w  ; длина всего пакета 
    iph_id.w      ; Идентификация 
    iph_offset.w  ; флаги и смещения 
    iph_ttl.b     ; время жизни пакета 
    iph_protocol.b; протокол 
    iph_xsum.w    ; контрольная сумма 
    iph_src.l     ; IP-адрес отправителя 
    iph_dest.l    ; IP-адрес назначения 
EndStructure 

;-tcp заголовок RFC 793 
Structure  TCPHeader 
    sourcePort.w        ; порт отправителя 
    destinationPort.w   ; порт назначения 
    sequenceNumber.l    ; номер последовательности 
    acknowledgeNumber.l ; номер подтверждения 
    dataoffset.b        ; смещение на область данных 
    flags.b             ; флаги 
    windows.w           ; размер окна 
    checksum.w          ; контрольная сумма 
    urgentPointer.w     ; срочность 
EndStructure 

;- udp заголовок RFC 768 
Structure UDPHeader 
    sourcePort.w        ; порт отправителя 
    destinationPort.w   ; порт назначения 
    len.w               ; длина пакета 
    checksum.w          ; контрольная сумма 
EndStructure 

;-ICMP заголовок 
Structure ICMPHeader 
   IcmpType.b           ; Тип пакета 
   IcmpCode.b           ; Код пакета 
   IcmpChecksum.w 
   IcmpId.w 
   IcmpSeq.w 
   IcmpTimestamp.w 
EndStructure 

Global Dim buff.b(#MAX_BUFF) 
Global raw_socket.l,lon.l 
Global addr.SOCKADDR_IN 
Global wsadata.WSADATA 
Global IPnet.l 
Global promiscuous_mode.l=1 
Global i.l 

;-Определение IP компьютера 
If InitNetwork() 
  ExamineIPAddresses() 
  IPnet=NextIPAddress() 
EndIf 

;-Инициализация сокетов 
If WSAStartup_(#WSA_VER, @wsadata) 
  WSACleanup_() 
  MessageRequester("Error", "Unable to initialize sockets.", 0) 
  End 
EndIf 
;-Создание сокета 
raw_socket = SOCKET_(#AF_INET, #SOCK_RAW, #IPPROTO_IP) 
If raw_socket = #INVALID_SOCKET 
  WSACleanup_() 
  MessageRequester("Error", "Can not create socket.", 0) 
  End 
EndIf 
;-Задание информаций о локальном хосте 
addr\sin_family = #AF_INET 
addr\sin_addr = IPnet 
;addr\sin_port=8080 
;-Привязка сокета 
If bind_(raw_socket, @addr, SizeOf (SOCKADDR_IN)) 
  WSACleanup_() 
  MessageRequester("Error", "Unable to bind socket", 0) 
  End 
EndIf 
;-Переключаем интерфейс на прием всех пакетов проходящих через интерфейс - promiscuous mode. 
If ioctlsocket_(raw_socket,#SIO_RCVALL,@promiscuous_mode) 
  WSACleanup_() 
  MessageRequester("Error", "Unable to switch in promiscuous mode.", 0) 
  End 
EndIf 

OpenFile(0,"snif.log") 

Repeat 
  lon = recv_(raw_socket,@buff(),#MAX_BUFF,0) 
;   If send_(raw_socket,@buff(),#MAX_BUFF,0) = #SOCKET_ERROR 
;       Debug "err" 
;   EndIf    
  If lon<1 
    WSACleanup_() 
    MessageRequester("Error", "Packet reading error.", 0) 
    End 
  EndIf 
  For i=1 To lon      
    WriteByte(0,buff(i)) 
  Next 
  FlushFileBuffers(0) 
ForEver 
closesocket_(raw_socket) 
WSACleanup_() 
End
This is а simple working sniffer for win2000 / XP. But on win7 it can't switch adapter mode, ioctlsocket_(raw_socket,#SIO_RCVALL,@promiscuous_mode) fails (returns non-zero). Does anyone know why?
Last edited by Machiavelli on Sat Jul 10, 2010 4:39 pm, edited 1 time in total.
Fred
Administrator
Administrator
Posts: 18153
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: Simple sniffer, promisc mode.

Post by Fred »

May be you need to have the admin rights ?
Machiavelli
User
User
Posts: 26
Joined: Sun May 24, 2009 2:38 pm

Re: Simple sniffer, promisc mode.

Post by Machiavelli »

Fred wrote:May be you need to have the admin rights ?
I have it.
DarkPlayer
Enthusiast
Enthusiast
Posts: 107
Joined: Thu May 06, 2010 11:36 pm

Re: Simple sniffer, promisc mode.

Post by DarkPlayer »

Hello,

if you would compare the result to the possible error codes, it would be much simpler to find the error. For a list of error codes: http://msdn.microsoft.com/en-us/library ... S.85).aspx
I think the error is:
http://msdn.microsoft.com/en-us/library/ee309610(VS.85).aspx wrote: Setting this IOCTL requires Administrator privilege on the local computer.
So you have to start it with Admin privileges.

DarkPlayer
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8451
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: Simple sniffer, promisc mode.

Post by netmaestro »

It seems working fine here on w7 x86, even without checking Admin Rights Mode in compiler options. But I am logged in as Administrator.
BERESHEIT
Post Reply