dans ces conditions, le gadget n'ajoute aucun paquet sur le réseau, on invente le ZERO-intrusif!
L'affichage du trafic est commandé par un fil entre les pin 12 et la masse.
// "Man in the middle" tcpdump
// http://antiguide.free.fr/wiki/wakka.php?wiki=ArduinoEnc28J60StereoManInTheMiddleTcpDump
#include <EtherCard.h>
#include <EtherCard_bis.h>
// pins assignment
// print controled by switch on pin 12
#define PINDUMP 12 // to be grounded for dump
// two enc28j60 CS
#define PINCSZOMBIE 49
#define PINCSLAN 53
// buffer size for ethernet packets
#define LENBUFFER 1800 // more than max windows tcp
byte IPDUMMY[4]={0,0,0,0};
byte LANMAC[6]={0,0,0,0,0,0};
byte ZOMBIEMAC[6]={0,0,0,0,0,0};
byte ENC28J60::buffer[LENBUFFER];
byte ENC28J60_bis::buffer[LENBUFFER];
int numzombie=0;
int numlan=0;
int success=0; // will be 1 if setup OK.
void setup () {
Serial.begin(9600);
Serial.println("\n[TCP-Pass-Through] 20140212 by flavigny");
digitalWrite(10,HIGH);
Serial.print( "Access Ethernet controller... on pin ");
Serial.println(PINCSZOMBIE);
if (ether.begin(sizeof ENC28J60::buffer, ZOMBIEMAC,PINCSZOMBIE) == 0) {
Serial.println( " Failed!");
return;
}
Serial.print( "Access Ethernet controller... on pin ");
Serial.println(PINCSLAN);
if (ether_bis.begin(sizeof ENC28J60_bis::buffer, LANMAC,PINCSLAN) == 0) {
Serial.println( "Failed!");
return;
}
ether.enablePromiscuous();
ether_bis.enablePromiscuous();
memcpy(ether.myip,IPDUMMY,4);
memcpy(ether.mymask,IPDUMMY,4);
memcpy(ether.gwip,IPDUMMY,4);
memcpy(ether.dnsip,IPDUMMY,4);
memcpy(ether_bis.myip,IPDUMMY,4);
memcpy(ether_bis.mymask,IPDUMMY,4);
memcpy(ether_bis.gwip,IPDUMMY,4);
memcpy(ether_bis.dnsip,IPDUMMY,4);
Serial.println( "Succes.!");
pinMode(PINDUMP,INPUT_PULLUP);
success=1 ;
}
void pthexa(char *buf,int base,int nb, char *t){
for (int iii=0;iii<nb;iii=iii+1) {
h2((uint8_t)buf[base+iii]);
Serial.print(" ");
}
if (nb==2) {
Serial.print(" (");
Serial.print((uint8_t)buf[base]*256+(uint8_t)buf[base+1]);
Serial.print(") ");
}
Serial.print("<-- ");
Serial.println(t);
}
void ptdec(char *buf,int base,int nb, char *t){
for (int iii=0;iii<nb;iii=iii+1) {
Serial.print((byte) buf[base+iii]);
Serial.print(" ");
}
if (nb==2) {
Serial.print(" (");
Serial.print((uint8_t)buf[base]*256+(uint8_t)buf[base+1]);
Serial.print(") ");
}
Serial.print("<-- ");
Serial.println(t);
}
void h2(int n){
char ALPHABET[]="0123456789ABCDEF";
Serial.print(ALPHABET[n/16]);
Serial.print(ALPHABET[n%16]);
}
void dump (char *tampon,int deb, int fin){
Serial.print("caracteres buffer a partir de " );
Serial.print(deb);
Serial.print(" jusqu'a ");
Serial.println(fin);
for (int iii=deb;iii<fin;iii=iii+1) Serial.print ((char)tampon[iii]);
Serial.println("");
Serial.print("-------Hexadecimal-----------");
for (int iii=deb;iii<fin;iii=iii+1) {
if (((iii-deb)%16)==0) Serial.println();
h2(tampon[iii]);
Serial.print(" ");
}
Serial.println("\n------------------");
}
void prtpkt(char *buf,char *tt,int tout ){
// for tcp-dump
int biglen;
int ICMP=0;
int TCP=0;
int ARP=0;
int UDP=0;
Serial.println("------------------");
Serial.print("-------prtpkt --: ");
Serial.print(tt);
Serial.print(" lon:");
Serial.print(tout);
Serial.print(" numero LAN:");
Serial.print(numlan);
Serial.print(" numero Zombie:");
Serial.print(numzombie);
Serial.println("");
//Serial.println("------------------");
pthexa(buf,0,6,"to mac ");
pthexa(buf,6,6,"from mac ");
pthexa(buf,12,1,"ether type - length (08) ");
pthexa(buf,13,1,"ether type 00/06 ??? ");
if (buf[13]==6) {
Serial.println("ARP");
ARP=1;
}
if (ARP==0) {
pthexa(buf,14,1," version ");
pthexa(buf,15,1," service ");
pthexa(buf,16,2," big len ");
biglen=(uint8_t)buf[16]*256+(uint8_t)buf[17];
Serial.print(" "); Serial.print(biglen);Serial.println(" decimal ");
pthexa(buf,18,2," id ");
pthexa(buf,20,2," flag ");
pthexa(buf,22,1," ttl ");
pthexa(buf,23,1," next ");
}
if (buf[23]==1){ ICMP=1;Serial.println("ICMP");}
if (buf[23]==6) {TCP=1;Serial.println("TCP");}
if (buf[23]==17) {UDP=1;Serial.println("UDP");}
if (ARP==0){
pthexa(buf,24,2," chk ");
ptdec(buf,26,4," source ip ");
ptdec(buf,30,4," dest ip ");
}
if (UDP){
pthexa(buf,34,2," Sourc port");
pthexa(buf,36,2," Dest port");
pthexa(buf,38,2," payload length ");
pthexa(buf,40,2," checksum");
}
if (ARP){
pthexa(buf,14,2,"hardwware type");
pthexa(buf,16,2,"protocole type");
pthexa(buf,18,1,"hard addr length");
pthexa(buf,19,1,"proto addr lngth");
pthexa(buf,20,2,"op code (1 request 2 reply)");
pthexa(buf,22,6,"sender mac");
ptdec(buf,28,4,"sender IP");
pthexa(buf,32,6,"destination mac add");
ptdec(buf,38,4,"destination IP");
// if (arp<=0) closed=true;
// todo=5;
}
if (ICMP) {
pthexa(buf,34,1," type 8 ");
pthexa(buf,35,1," code 0 ");
pthexa(buf,36,2," chk ");
pthexa(buf,38,2," id 4019 ");
pthexa(buf,40,2," seq num ");
dump (buf,42,tout);
}
if (TCP) {
pthexa(buf,34,2," source port ");
pthexa(buf,36,2," dest port ");
pthexa(buf,38,4," seq num ");
pthexa(buf,42,4," ack num ");
pthexa(buf,46,2," hdr len ");
pthexa(buf,48,2," reserved ");
dump (buf, 50,tout);
}
if (!TCP & !ICMP) dump(buf,0,tout);
Serial.println("");
Serial.println("------------------");
}
//---------------------------------------------------------------
// --------------------------------------------------------------
void loop () {
if (!success) return;
// ---------------get from ZOMBIE
int qreceivedfromzombie= ether.packetReceive();
if (qreceivedfromzombie>0) {
numzombie=numzombie+1;
if (0==digitalRead(PINDUMP)) prtpkt((char*)ether.buffer,"de zombie",qreceivedfromzombie);
ether_bis.sendEthernet((char *)ether.buffer,qreceivedfromzombie);
return;
}
// get from LAN
int qreceivedfromlan= ether_bis.packetReceive();
if (qreceivedfromlan>0) {
numlan=numlan+1;
if (0==digitalRead(PINDUMP)) prtpkt((char*)ether_bis.buffer,"de LAN",qreceivedfromlan);
ether.sendEthernet((char *)ether_bis.buffer,qreceivedfromlan);
return;
}
}