1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
|
;-Debut
EnableExplicit
Structure IpHeader ;-Structure de l'entête IP
version.a
tos.a
totalLength.w
ID.w
flagOffset.w
ttl.a
protocol.a
checkSum.w
source.l
destination.l
EndStructure
Structure TcpHeader ;-Structure de l'entête TCP
sourcePort.w
destinationPort.w
sequenceNumber.l
acknowledgeNumber.l
dataOffset.a
flags.a
windows.w
checkSum.w
pointer.w
EndStructure
#SIO_RCVALL=$98000001
If OpenConsole() ;-Console principale
ConsoleTitle("Deimon [Tool - Sniffer local]")
ConsoleColor(12,0)
;Declaration des variables
Global ipNet.l, wsa.WSADATA, socket.l, sin.SOCKADDR_IN, csin.SOCKADDR_IN, INADDR_ANY, promiscuous_mode.l=1, *buffer, bufferSize.i, ip.IPHeader, tcp.TcpHeader, dat.s
Global received.i, sourcePort.u, destinationPort.u, ipSource.s, ipDestination.s, ipCheckSum, ipId, ipTTL, ipVersion, ipflagOffset, tcpSequenceNumber, tcpCheckSum, tcpDataOffset, tcpFlag, tcpPointer
Global protocole$, bind, connexion$, ioctlsocket, send, connect, listen, accept, reception, o
InitNetwork() ;-Initialisation du réseau
If WSAStartup_($202, @wsa)
PrintN("Impossible d'acceder au réseau!")
PrintN("Appuyez sur une touche pour quitter...")
Input()
End
EndIf
;socket=SOCKET_(#AF_INET, #SOCK_RAW, #IPPROTO_IP) ;-Creation du socket
socket=SOCKET_(#AF_INET, #SOCK_STREAM, #IPPROTO_IP) ;Socket de flux (stream) pour send_() et recv_() et accept_() et connect_()
;socket=SOCKET_(#AF_INET, #SOCK_DGRAM, #IPPROTO_IP) ;Socket de paquet (datagram) pour sendto_() et recvfrom_()
If socket=#INVALID_SOCKET
WSACleanup_()
PrintN("Impossible de créer le socket!")
PrintN("Appuyez sur une touche pour quitter...")
Input()
End
EndIf
;ICI les structures associées au socket
;ExamineIPAddresses()
;ipNet=NextIPAddress() ;Notre addresse ip
;ipNet=MakeIPAddress(*,*,*,*) ;Addresse ip
sin\sin_family=#AF_INET ;-Famille du paquet: #AF_INET: constante
sin\sin_addr=htonl_(INADDR_ANY)
;sin\sin_addr=inet_addr_() ;-Addresse ip à mettre ici!
sin\sin_port=htons_(40002) ;-Port (si=0 alors choix automatique)
bind=bind_(socket, @sin, SizeOf(SOCKADDR_IN)) ;-Associe notre addresse locale (dans la strucure) à la socket
If bind=#SOCKET_ERROR
WSACleanup_()
PrintN("Ecoute impossible!")
PrintN("Appuyez sur une touche pour quitter...")
Input()
End
EndIf
;ioctlsocket=ioctlsocket_(socket, #SIO_RCVALL, @promiscuous_mode) ;-Passage en mode promiscuous en mettant argp=1
;If ioctlsocket=#SOCKET_ERROR
;WSACleanup_()
;PrintN("Impossible de passer en mode promiscuous!")
;PrintN("Appuyez sur une touche pour quitter...")
;Input()
;End
;EndIf
;connect=connect_(socket, @sin, SizeOf(SOCKADDR_IN)) ;-Connexion à ipNet
;If connect=#SOCKET_ERROR
;WSACleanup_()
;PrintN("Connexion échouée!")
;PrintN("Appuyez sur une touche pour quitter...")
;Input()
;End
;Else
;PrintN("Connexion établie!")
;Input()
;EndIf
listen=99
Repeat
listen=listen_(socket, 5) ;-Attente d'une connexion
If listen=#SOCKET_ERROR
WSACleanup_()
PrintN("Impossible de passer en mode ecoute!")
PrintN("Appuyez sur une touche pour quitter...")
Input()
End
Else
PrintN("En attente d'une connexion...")
EndIf
Until listen=0
;bufferSize=10000 ;Taille de l'allocation
;*buffer=AllocateMemory(bufferSize) ;-Allocation de la mémoire pour la reception de données
Repeat
;accept=accept_(socket, @sin, SizeOf(SOCKADDR_IN)) ;-Acceptation de la connexion
accept=accept_(socket, @csin, SizeOf(SOCKADDR_IN))
If accept=#SOCKET_ERROR
;WSACleanup_()
;PrintN("Acceptation impossible!")
;PrintN("Appuyez sur une touche pour quitter...")
;Input()
;End
Else
PrintN("Connexion accépté!")
PrintN(""+Str(accept))
Input()
EndIf
;PrintN("IP: "+Str(inet_ntoa_(csin\sin_addr)))
;PrintN("Port: "+Str(htons_(csin\sin_port)))
;-Reception de données
;received=recv_(accept, *buffer, bufferSize, 0) ;-Reception de données avec socket raw
;If received<>#SOCKET_ERROR
;PrintN("Données recues!")
;PrintN(PeekS(*Buffer))
;dat=Space(received-SizeOf(IpHeader)-SizeOf(TcpHeader))
;CopyMemory(*buffer, @ip, SizeOf(IpHeader)) ;-Entêtes/couche IP
;CopyMemory(*buffer+SizeOf(IpHeader), @tcp, SizeOf(TcpHeader)) ;-Entêtes/couche TCP
;CopyMemory(*buffer+SizeOf(IpHeader)+SizeOf(TcpHeader), @dat, Len(dat)) ;-Entêtes/couche de données (data)
;If ip\protocol=6 ;Protocole TCP
;protocole$="Type de paquet: TCP"
;ElseIf ip\protocol=2 ;-Protocole IGMP
;protocole$="Type de paquet: IGMP"
;ElseIf ip\protocol=1 ;-Protocole ICMP
;protocole$="Type de paquet: ICMP"
;ElseIf ip\protocol=17 ;-Protocole UDP
;protocole$="Type de paquet: UDP"
;EndIf
;sourcePort=ntohs_(tcp\sourcePort) ;-Port de la source
;destinationPort=ntohs_(tcp\destinationPort) ;-Port du destinataire
;ipSource=IPString(ip\source) ;-L'ip de la source
;ipDestination=IPString(ip\destination) ;-L'ip de du destinataire
;ipCheckSum=ntohs_(ip\checkSum)
;ipId=ntohs_(ip\ID)
;ipTTL=ntohs_(ip\ttl)
;ipVersion=ntohs_(ip\version)
;ipflagOffset=ntohs_(ip\flagOffset)
;tcpSequenceNumber=ntohs_(tcp\sequenceNumber)
;tcpPointer=ntohs_(tcp\pointer)
;tcpCheckSum=ntohs_(tcp\checkSum)
;tcpFlag=ntohs_(tcp\flags)
;tcpDataOffset=ntohs_(tcp\dataOffset)
;PrintN("---------------------------")
;PrintN(" RECEPTION")
;PrintN(" Infos:")
;PrintN("Protocole: "+protocole$)
;PrintN("IpCheckSum: "+Str(ipCheckSum))
;PrintN("IpId: "+Str(ipId))
;PrintN("IpTTL: "+Str(ipTTL))
;PrintN("IpVersion"+Str(ipVersion))
;PrintN("IpFlagOffSet: "+Str(ipflagOffset))
;PrintN("TcpSequenceNumber: "+Str(tcpSequenceNumber))
;PrintN("TcpPointer: "+Str(tcpPointer))
;PrintN("TcpCheckSum: "+Str(tcpCheckSum))
;PrintN("TcpFlag: "+Str(tcpFlag))
;PrintN("TcpDataOffSet: "+Str(tcpDataOffset))
;PrintN(ipSource+" ----> "+ipDestination)
;PrintN("Ports: "+Str(sourcePort)+" "+Str(destinationPort))
;PrintN("Taille: "+Str(MemorySize(*Buffer)))
;PrintN(" DONNEES: ")
;PrintN(dat)
;PrintN("---------------------------")
;EndIf
;-Fin de reception de données
;-Envois de données
;send=sendto_(socket, *buffer, bufferSize, 0, @sin, SizeOf(SOCKADDR_IN)) ;Pas besoin de connect_(), avec socket datagram
;send=send_(socket, *buffer, bufferSize, 0) ;Besoin de connect_(), avec socket stream
;If send>0
;PrintN("---------------------------")
;PrintN(" ENVOIS")
;PrintN("")
;PrintN("192.168.0.44 ----> "+IPString(ipNet))
;PrintN("Ports: "+Str(sin\sin_port))
;PrintN("Taille: "+Str(MemorySize(*Buffer)))
;PrintN(" DONNEES: ")
;PrintN(PeekS(*Buffer))
;PrintN("---------------------------")
;Input()
;Else
;PrintN("Envois echoue!")
;Input()
;EndIf
;-Fin d'envois de données
ForEver
closesocket_(socket) ;Fermeture du socket
;shutdown_(socket, 2)
WSACleanup_()
EndIf
;-Fin |
Partager