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