如何用Python读取保存在文件中的数据包?

时间:2013-05-06 06:11:23

标签: python packet-capture

我有一个生成IP数据包标头的C ++代码。代码使用表示数据包中每个字段的结构:

struct cip {
   uint8_t        ip_hl:4, /* both fields are 4 bytes */
                  ip_v:4;
   uint8_t        ip_tos;
   uint16_t       ip_len;
   uint16_t       ip_id;
   uint16_t       ip_off;
   uint8_t        ip_ttl;
   uint8_t        ip_p;
   uint16_t       ip_sum;
   struct in_addr ip_src;
   struct in_addr ip_dst;
   char       head[100];
};

用户提示输入消息以输入结构中每个变量的值:

  

输入文件名以保存数据包:数据包

     

输入IP版本(0-15):4

     

输入标题长度(5-15):5

     

输入服务类型(0-255):55

     

输入数据包总大小(字节,20,200):25

创建数据包并将其保存在文件中:

FILE* f = fopen(file, "w");
int success = fwrite(&packet, sizeof(char), ((unsigned int)packet.ip_hl)*4,f);
if(success <= 0) {
    printf("Error writing packet header");
}
success = fwrite(&data, sizeof(char),ntohs(packet.ip_len)-(4*packet.ip_hl),f);
if(success < 0) {
    printf("Error writing packet data");
}
fflush(f);
fclose(f);
printf("\nPacket Written.\n");

我没有创建这个代码,有人给了我代码,所以我可以在Python中创建其他程序来验证上面程序创建的数据包。验证包括验证为数据包生成的校验和,Ip数据包的版本,协议,标头长度等。

所以我想知道是否有人可以帮我弄清楚如何阅读文件并解析框架。我试图将文件中的行作为字符串读取,但我遇到的问题是文件在创建后看起来像这样:(它是不可读的)

  

OÈ,@šÀ¨À¨   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDATA_的 _ __ _ __ _ __ _ __ _ __ < EM> _ __ _ __ _ DATA _ __ < em> _ __ _ __ _ __ ô·

我不明白为什么:(我猜这是因为大于1字节的变量被函数“htons”转换为大端:

printf("\nEnter ip ID number(0-65535):\n");
scanf("%d", &input);
packet.ip_id = htons(input);

我尝试使用socket.makefile()来搜索另一个选项,但这会帮助我将程序中的套接字作为文件,但我需要做的是解析在这个文件中给我的框架

有什么想法吗?

感谢。

P.S。:还有人可以给我一个链接,我可以在这里找到如何将整数从big endian转换为small endian和vicerversa的Python。谢谢!

1 个答案:

答案 0 :(得分:1)

您应该像往常一样阅读文件(为Windows指定“二进制”模式):

with open("test.txt", 'br') as f:
    for line in f.readlines():
        # process lines

要解压缩二进制数据,您应该使用struct包,它也可以处理big and little endian等等。结构示例:

print struct.unpack('BBHHHBBH100s', line)

我省略了ip_srcip_dst解压缩,因为您没有指定其结构的内容。要读取的最小值是一个字节,因此要将第一个字段拆分为两部分,您可以使用:

(ip_hl, ip_v) = (value >> 4, value & 15)

当然,8位组件的顺序取决于你的struct endianess。