在C中解析二进制文件

时间:2015-05-11 02:42:43

标签: c binary

我正在进行分配,我需要剖析二进制文件,从头数据中检索源地址。我能够从文件中获取十六进制数据,以便按照我们的指示写出,但我无法对我所看到的内容做出正面或反面。这是我使用的打印输出代码。

sudo ln -s /usr/local/bin/node /usr/bin/node

这是输出的一小部分:

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 );

因此,我们使用此图表来帮助分配enter image description here

我真的很难将二进制文件中的信息转换为一些我可以管理的有用的东西,而且搜索网站并没有给我带来太多帮助。我只是需要一些帮助才能使我朝着正确的方向前进。

1 个答案:

答案 0 :(得分:2)

好的,看起来你实际上正在根据图表反转IP数据包的一部分。该图基于32位字,每个位都显示为小的“#”标记。沿着水平标尺看着顶部的东西。字节显示为大字符&#39;在最高统治者。

因此,如果您要读取文件的第一个字节,则低位半字节(低位四字节)包含版本,高位半字节包含标题中的32位字数(假设我们可以将其解释为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中有源地址。

好的,为了使这更加具体,这是我从家庭网络捕获的数据包:

    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  .(..@.........^.
    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地址,新的两个字节{{1 }}表示下一个标题是IP类型。

接下来的20个字节是IP头(在图中显示),这些字节是:

(08 00)

所以要解释这个让我们看一下4字节的单词。

第一个4字节字 0000 45 00 00 28 18 c7 40 00 80 06 00 00 c0 a8 01 05 E..(..@......... 0010 5e 1f 1d 9a ^... ,根据你的数字是:

(45 00 00 28)

第二个4字节字 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. ,根据你的数字是:

(18 c7 40 00)

第三个4字节字 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 ,根据你的数字是:

(80 06 00 00)

第四个4字节字 first byte : TTL, 0x80 or 128 hops second byte : protocol 0x06 or TCP 3rd & 4th bytes: 0x00 0x00 ,根据你的数字是:

(c0 a8 01 05)

第五个4字节字 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. ,根据你的数字是:

(5e 1f 1d 9a)

一开始做这种类型的编程有点令人困惑,我建议用手去做几次(就像我上面做的那样),以便掌握它。

最后一点,在这行代码 1st to 4th bytes: destination address, in this case 94.31.29.154 中,我建议将其更改为printf("%02x", (unsigned int)buf[i]);。请记住, buf 数组中的每个元素都表示从文件中读取的单个字节。

希望这有帮助, 吨。