Aujourd'hui je tente de sniffer les paquets transitant sur mon PC. Voici le code que j'ai fait (largement inspiré de celui-ci: http://www.purebasic.fr/english/viewtop ... it=sniffer) :
Code : Tout sélectionner
EnableExplicit
Structure IpHeader
version.a
tos.a
totalLength.w
ID.w
flagOffset.w
ttl.a
protocol.a
checkSum.w
source.l
destination.l
EndStructure
Structure TcpHeader
sourcePort.w
destinationPort.w
sequenceNumber.l
acknowledgeNumber.l
dataOffset.a
flags.a
windows.w
checkSum.w
pointer.w
EndStructure
#SIO_RCVALL=$98000001
Procedure main()
Protected ipNet.l, wsa.WSADATA, socket.l, sin.SOCKADDR_IN, promiscuous_mode.l=1, *buffer, bufferSize.i, ip.IPHeader, tcp.TcpHeader, dat.s
Protected received.i, sourcePort.u, destinationPort.u, ipSource.s, ipDestination.s
InitNetwork()
ExamineIPAddresses()
ipNet = NextIPAddress()
If WSAStartup_($202, @wsa)
Debug "Impossible d'acceder au réseau"
ProcedureReturn 0
EndIf
socket = SOCKET_(#AF_INET, #SOCK_RAW, #IPPROTO_IP)
If socket = #INVALID_SOCKET
WSACleanup_()
Debug "Impossible de créer le socket"
ProcedureReturn 0
EndIf
sin\sin_addr = ipNet
sin\sin_family = #AF_INET
If bind_(socket, @sin, SizeOf(SOCKADDR_IN))
WSACleanup_()
Debug "Ecoute impossible"
ProcedureReturn 0
EndIf
If ioctlsocket_(socket, #SIO_RCVALL, @promiscuous_mode)
WSACleanup_()
Debug "Impossible de passer en mode promiscuous"
ProcedureReturn 0
EndIf
bufferSize = 2048
*buffer = AllocateMemory(bufferSize)
Repeat
received = recv_(socket, *buffer, bufferSize, 0)
If received > 0
dat = Space(received - SizeOf(IpHeader)-SizeOf(TcpHeader))
CopyMemory(*buffer, @ip, SizeOf(IpHeader))
CopyMemory(*buffer+SizeOf(IpHeader), @tcp, SizeOf(TcpHeader))
CopyMemory(*buffer+SizeOf(IpHeader)+SizeOf(TcpHeader), @dat, Len(dat))
If ip\protocol = 6 ;protocole TCP
sourcePort = ntohs_(tcp\sourcePort)
destinationPort = ntohs_(tcp\destinationPort)
ipSource = IPString(ip\source)
ipDestination = IPString(ip\destination)
Debug ipSource+":"+Str(sourcePort)+" => "+ipDestination+":"+Str(destinationPort)
Debug Left(dat, 20)
Debug "---"
EndIf
EndIf
ForEver
closesocket_(socket)
WSACleanup_()
ProcedureReturn 0
EndProcedure
main()
End
Bon mon problème est le suivant: j'arrive à "sniffer" les données sortantes mais je n'ai pas les données entrantes. Est-ce la même chose chez vous ? Et quelqu'un à-t-il une solution à mon porblème ?
Merci d'avance =)