Bon aller je laisse un bout de code de mon sniffeur.
/!\ Pour qu'il fonctionne, il faut activer les droit d'administrateur dans les options du compilateur. Je vous laisse le soins d'analyser le code (il est commenté):
Code:
; ******************************
; ********** Sniffeur **********
; ******** Par lepiaf31 ********
; ******************************
EnableExplicit
Structure IpHeader
IhlVersion.b
typeOfService.b
totalLength.w
ID.w
flagOffset.b
fragOffset.b
timeToLive.b
protocol.b
checksum.w
source.l
destination.l
EndStructure
Structure TcpHeader
portSource.w
portDestination.w
seqNum.l
ackNum.l
dataOffset.b
flags.b
window.w
checksum.w
urgentPointer.w
EndStructure
#WSA_VER = $202
#SIO_RCVALL=$98000001
#TcpProtocol = 6
#BufferSize = 4096
Procedure manageData(*buffer, size.i)
Protected ipHeader.IPHeader, tcpHeader.TcpHeader, sourcePort.i, destinationPort.i
If size > 40 ;on veut un paquet TCP/IP complet avec des données utiles
;récupération de l'en-tete IP
CopyMemory(*buffer, @ipHeader, SizeOf(IpHeader))
If ipHeader\protocol = #TcpProtocol ;Connexions TCP seulement
;récupération de l'en-tete TCP
CopyMemory(*buffer+SizeOf(IpHeader), @tcpHeader, SizeOf(TcpHeader))
;Ports
sourcePort = ntohs_(tcpHeader\portSource)
destinationPort = ntohs_(tcpHeader\portDestination)
PrintN("Connexion: "+IPString(ipHeader\source)+" -> "+IPString(ipHeader\destination))
PrintN("Port Source: "+Str(sourcePort))
PrintN("Port Destination: "+Str(destinationPort))
PrintN("")
EndIf
EndIf
EndProcedure
Procedure sniff(*function)
Protected ip.i, wsaData.WSADATA, sin.SOCKADDR_IN, promiscuous_mode.l, sock.i, *buffer, size.i
promiscuous_mode = 1
;récupération de l'IP
If InitNetwork()
ExamineIPAddresses()
ip = NextIPAddress()
Else
ProcedureReturn 0
EndIf
;Démarrage
If WSAStartup_(#WSA_VER, @wsaData)
WSACleanup_()
ProcedureReturn 0
EndIf
;Creation du socket
sock = SOCKET_(#AF_INET, #SOCK_RAW, #IPPROTO_IP)
If sock = #INVALID_SOCKET
WSACleanup_()
ProcedureReturn 0
EndIf
sin\sin_family = #AF_INET
sin\sin_addr = ip
;mode sniffing
If bind_(sock, @sin, SizeOf(SOCKADDR_IN))
WSACleanup_()
ProcedureReturn 0
EndIf
If ioctlsocket_(sock, #SIO_RCVALL, @promiscuous_mode)
WSACleanup_()
ProcedureReturn 0
EndIf
*buffer = AllocateMemory(#BufferSize) ;allocation de la memoire de reception
Repeat
size = recv_(sock, *buffer, #BufferSize, 0)
CallFunctionFast(*function, *buffer, size) ;traitement des données
ForEver
FreeMemory(*buffer)
ProcedureReturn 1
EndProcedure
OpenConsole()
sniff(@manageData())
End
Le résultat:
