1 svar
87 visningar
rka82 65
Postad: 19 dec 2017

Läsa nätverksdump

Hej! Har slitit mitt hår och uppskattar hjälp! Jag har en uppgift där jag ska läsa ut payloaden ur en nätverksdump. Man ska läsa bort 3 lager för att sedan kunna få ut payloaden. Enligt instruktion definieras en void pekare som ska peka på en binärfil och paketet läses in till voidpekaren. Enligt instruktion så är det första lagret alltid 14byte, därför ska pekaren flyttas fram med detta värde innan man ska få ut nästa steg mha ett macro. (pekaren konverteras igen och sätts in i en funktion, IP_HL(*ip)) Men problemet ligger i detta första steg, hur flyttar jag förbi det första lagret,ethernet? En viodpekare fungerar inte aritmetik på. Jag konverterar voidpekaren till en ethernetpekare men hur får jag pekaren till att flytta sig? Enligt läraren ska man ta värdet från ptr och addera 14....Hur jag än gör så flyttar inte pekaren sig.. (står på 0 om man kollar med ftell) Allt måste ju baseras på värdet av ptr för att komma rätt i filen.Koden jag har följer nedan. Några tips? Någon funktion jag ska använda som tex fseek?

int size;
FILE *input;
input = fopen("TCPdump", "rb");    //öppnar fil
fscanf(input, "%d", &size);               //läser filstorlek på rad 1
fgetc(input);                                       //läser in tecken och kommer till nästa rad
void *ptr;                                          //deklarerar en void pekare
ptr = (void*)malloc(size);                //skapar minnesplats
fread(ptr, size, 1, input);                  //läser in filen till voidpekaren
rewind(input);                                  //flyttar pekaren till filens början
struct ethernet_hdr *ethernetPtr; //konverterar pekare
ethernetPtr = (struct ethernet_hdr*)ptr;

int i;                                                               //kontroll var pekaren står i binärfilen
i = ftell(input);                                            //vill ha fram pekaren till IPlagret dvs +14 byte
printf("%d", i);                                           //resultat här är noll

                                                                   //struct ethernet_hdr är definierad i en headerfil

rka82 65
Postad: 19 dec 2017

Fortsätter....... Har testat skriva så här:

                                                                           //raderar rewind och ersätter med fseek
struct ethernet_hdr *ethernetPtr; //konverterar pekare
ethernetPtr = (struct ethernet_hdr*)ptr;
fseek(input, sizeof(struct ethernet_hdr), SEEK_SET);

struct ip_hdr *ipPtr;
ipPtr =(struct ip_hdr*)ethernetPtr;
ipPtr = &ethernetPtr;                                      // adressen till ethernetvärdet
fseek(input, IP_HL(ipPtr), SEEK_CUR);

struct tcp_hdr *tcpPtr;
tcpPtr = (struct tcp_hdr*)ipPtr;
tcpPtr = &ipPtr;                                                 // adressen till ethernetvärdet
fseek(input, TH_OFF(tcpPtr), SEEK_CUR);

Detta ger mig olika positioner på pekaren i filen varje gång. Känns som att jag misstolkar något. IP bestäms med: 

#define IP_HL(ip) ((((ip)->vhl) & 0x0f) * 4) /* Gets length of the IP header, use with (ip_hdr *) */

 

och tcp med:

#define TH_OFF(th) ((((th)->offx2 & 0xf0) >> 4) * 4) /* Gets length of the TCP header, use with (tcp_hdr *) */ 

Svara Avbryt
Close