2015-05-11 3 views
1

Я работаю над назначением, в котором мне нужно проанализировать двоичный файл, чтобы получить исходный адрес из данных заголовка. Я смог получить шестнадцатеричные данные из файла, чтобы написать, как нам было дано указание, но я не могу сделать головы или хвосты того, что я смотрю. Вот код распечатки, который я использовал.Распаковка двоичного файла в C

FILE *ptr_myfile; 
char buf[8]; 

ptr_myfile = fopen("packets.1","rb"); 
if (!ptr_myfile) 
{ 
    printf("Unable to open file!"); 
    return 1; 
} 

size_t rb; 
do { 
    rb = fread(buf, 1, 8, ptr_myfile); 
    if(rb) { 
     size_t i; 
     for(i = 0; i < rb; ++i) { 
       printf("%02x", (unsigned int)buf[i]); 
     } 
     printf("\n"); 
    } 
} while(rb); 

А вот небольшая часть выхода:

120000003c000000 
4500003c195d0000 
ffffff80011b60ffffff8115250b 
4a7d156708004d56 
0001000561626364 
65666768696a6b6c 
6d6e6f7071727374 
7576776162636465 
666768693c000000 
4500003c00000000 
ffffffff01ffffffb5ffffffbc4a7d1567 
ffffff8115250b00005556 
0001000561626364 
65666768696a6b6c 
6d6e6f7071727374 
7576776162636465 
666768693c000000 
4500003c195d0000 
ffffff8001775545ffffffcfffffffbe29 
ffffff8115250108004d56 
0001000561626364 
65666768696a6b6c 
6d6e6f7071727374 
7576776162636465 
666768693c000000 
4500003c195f0000 
...... 

Таким образом, мы используем эту схему, чтобы помочь в назначении enter image description here

Я действительно возникли трудности перевод информации из двоичного файла файл к чему-то полезному, что я могу управлять, и поиск на сайте не принес мне многого. Мне просто нужна помощь, чтобы я оказался в правильном направлении.

+0

ЬиХ не определенно. – stark

+0

Хе-хе, этот код работает, я его не поместил. Код работает так, как должен, я просто не знаю, куда идти оттуда –

+0

Итак, вы знаете порядок байтов двоичного формата и порядок байтов вашей платформы (пожалуйста, подтвердите, являются ли они одинаковыми или разными) , а buf - массив unsigned char? Мы не любим играть здесь «Великий Крескин». См. Http://stackoverflow.com/help/mcve - (нам нужен компилируемый пример). – JohnH

ответ

2

Хорошо, похоже, что вы фактически меняете части IP-пакета на основе диаграммы. Эта диаграмма основана на 32-битных словах, причем каждый бит показан как маленькие «тики» вдоль горизонтальной линейки, смотрящей вверху. Байты показаны как большие «тики» на верхней линейке.

Итак, если вы должны были прочитать первый байт файла, младший полубайт (четыре байта младшего разряда) содержит версию, а полубайт высокого порядка содержит число 32-битных слов в header (предполагая, что мы можем интерпретировать это как заголовок IP).

Итак, с вашей диаграммы вы можете видеть, что исходный адрес находится в четвертом слове, поэтому, чтобы прочитать это, вы можете переместить точку файла в эту точку и прочитать в четырех байтах. Таким образом, в псевдо-код, который вы должны быть в состоянии сделать это:

fp = fopen("the file name") 
    fseek(fp, 12)     // advance the file pointer 12 bytes 
    fread(buf, 1, 4, fp)   // read in four bytes from the file. 

Теперь вы должны иметь адрес источника в BUF.

OK, чтобы сделать это немного более конкретным, вот пакет я захватил с моей домашней сети:

0000 00 15 ff 2e 93 78 bc 5f f4 fc e0 b6 08 00 45 00 .....x._......E. 
    0010 00 28 18 c7 40 00 80 06 00 00 c0 a8 01 05 5e 1f .([email protected]^. 
    0020 1d 9a fd d3 00 50 bd 72 7e e9 cf 19 6a 19 50 10 .....P.r~...j.P. 
    0030 41 10 3d 81 00 00        A.=... 

Первые 14 байт являетесь EthernetII заголовок, первые шесть байтов (00 15 ff 2e 93 78), являющихся местом MAC-адрес, следующие шесть байтов (bc 5f f4 fc e0 b6) является исходным MAC-адресом, а два новых байта (08 00) означают, что следующий заголовок имеет тип IP.

Следующие двадцать байт в IP-заголовке (который вы показываете в вашей фигуре), эти байты:

0000 45 00 00 28 18 c7 40 00 80 06 00 00 c0 a8 01 05 E..([email protected] 
    0010 5e 1f 1d 9a          ^... 

Так истолковывать это позволяет смотреть на 4-байтовые словах.

Первый 4-байтовое слово (45 00 00 28), в соответствии с вашей фигуры:

 first byte  : version & length, we have 0x45 meaning IPv4, and 5 4-byte words in length 
    second byte : Type of Service 0x00 
    3rd & 4th bytes: total length 0x00 0x28 or 40 bytes. 

Второй 4-байтовое слово (18 c7 40 00), в соответствии с вашей фигуры:

 1st & 2nd bytes: identification 0x18 0xc7 
    3rd & 4th bytes: flags (3-bits) & fragmentation offset (13-bits) 
         flags - 0x02 0x40 is 0100 0000 in binary, and taking the first three bits 010 gives us 0x02 for the flags. 
         offset - 0x00 

Третий 4- байтное слово (80 06 00 00), согласно вашему рисунку:

 first byte  : TTL, 0x80 or 128 hops 
    second byte : protocol 0x06 or TCP 
    3rd & 4th bytes: 0x00 0x00 

Четвертого 4-байтовое слово (c0 a8 01 05), в соответствии с вашей фигурой:

 1st to 4th bytes: source address, in this case 192.168.1.5 
         notice that each byte corresponds to one of the octets in the IP address. 

Пятым 4-байтовое слово (5e 1f 1d 9a), в соответствии с вашими фигурами:

 1st to 4th bytes: destination address, in this case 94.31.29.154 

Выполнением этого типа программирования является сначала сбив с толку, я рекомендую сделать пару раз (например, я сделал выше) несколько раз, чтобы повесить его.

В этой строке кода printf("%02x", (unsigned int)buf[i]); я бы рекомендовал изменить его на printf("%02x ", (unsigned char)buf[i]);. Помните, что каждый элемент в вас buf массив представляет собой один байт, считанный из файла.

Надеется, что это помогает, Т.

+0

Ничего себе это очень полезно! Что относительно строк, как 3-я и 11-я, 12-я строки. Являются ли они некоторыми другими данными, не входящими в отдельные пакеты? Они, похоже, не соответствуют диаграмме –

+1

Вы правы, поэтому я подозреваю, что у вас есть ошибка в вашем отображаемом коде. Было бы полезно открыть исходный файл в hexeditor - Я использую frhed (в Windows) или Okteta или xxd (в Linux), просто чтобы убедиться, что ваш код отображения верен. – thurizas

+0

Как только я изменил строку печати как символ вместо int, эти строки напечатаны правильно –

Смежные вопросы