I wrote a c-lang program to read a .pcap file.What fogs me is that the data I read was with a different endianness as to WireShark.
I'm working on X86 ach, as I can see, it's LittleEndian.
So, can I read the .pcap file with BigEndian? How?
Code fragments:
/*
* global header
*/
typedef struct{
// fileds here
} GlobalHdr;
/*
* record (packet) header
*/
typedef struct{
// fileds here
} RecordHdr;
/*
* IP v4 header
*/
typedef struct{
// fileds here
/* the options start here, if tot_len is bigger than 5*/
} Ipv4Hdr;
/*
* UDP header
*/
typedef struct{
// fileds here
} UdpHdr;
/*
* main function
*/
int main(){
FILE *srcfile = NULL; // the .pcap file
GlobalHdr g_hdr = {0};
RecordHdr r_hdr = {0};
Ipv4Hdr ip_hdr = {0};
UdpHdr u_hdr = {0};
unsigned long fl_len = 0;
unsigned long index = 0;
unsigned char sizghdr = sizeof(GlobalHdr);
unsigned char sizrhdr = sizeof(RecordHdr);
unsigned char sizihdr = sizeof(Ipv4Hdr);
unsigned char sizuhdr = sizeof(UdpHdr);
srcfile = fopen (SRC_FILE, "r");
if(!srcfile){
PERR ("source file opening");
}
fseek (srcfile, 0, SEEK_END);
fl_len = ftell (srcfile);
fseek (srcfile, 0, SEEK_SET);
printf ("file length: %ld\n", fl_len);
// read file global header
CHECK_POSITION (sizghdr);
if(!fread (&g_hdr, sizghdr, 1, srcfile)){
PERR ("reading global header");
}
print_ghdr (&g_hdr);
// read blocks
while(1){
// read block header
CHECK_POSITION (sizrhdr);
if(!fread (&r_hdr, sizrhdr, 1, srcfile)){
PERR ("reading block header");
}
print_rhdr (&r_hdr);
// read ethernet header
CHECK_POSITION (LINK_LAYER_LEN);
fseek (srcfile, index, SEEK_SET);
// read IP header
CHECK_POSITION (sizihdr);
if(!fread (&ip_hdr, sizihdr, 1, srcfile)){
PERR ("reading ip header");
}
print_iphdr (&ip_hdr);
// read UDP header
CHECK_POSITION (sizuhdr);
if(!fread (&u_hdr, sizuhdr, 1, srcfile)){
PERR ("reading upd header");
}
print_udphdr (&u_hdr);
// read contained data
CHECK_POSITION (r_hdr.orig_len - sizrhdr
- LINK_LAYER_LEN - sizihdr - sizuhdr
);
fseek (srcfile, index, SEEK_SET);
}
// clean up
puts ("Done!");
CLEAN_UP;
return 0;
}