我正在读取原始数据包数据并将其转换为Pcap格式(具有此功能)。我有一个原始数据包列表(列表格式),我需要读取每个数据包并将其附加到pcap格式的pcap文件中。我尝试使用mergecap,但它不起作用。所以我尝试了另一件事tail -c +25 file2.pcap >> file1.pcap
并且它有效。
我将数据包[0]转换为pcap,使用下面的代码将其存储在pcap文件中,然后对剩余的数据包执行类似的操作,并继续使用tail命令附加pcap文件。但它只是一个开销(因为我有10 ^ 6个数据包)。
这是我做的 -
class Pcap:
def __init__( self, filename, link_type=PCAP_DATA_LINK_TYPE ):
self.pcap_file = open( filename, 'wb' )
self.pcap_file.write( struct.pack( '@ I H H i I I I ',
PCAP_MAGICAL_NUMBER, PCAP_MJ_VERN_NUMBER,
PCAP_MI_VERN_NUMBER, PCAP_LOCAL_CORECTIN,
PCAP_ACCUR_TIMSTAMP, PCAP_MAX_LENGTH_CAP, link_type ) )
def writelist( self, data ):
for i in data:
self.write( i )
return
def write( self, data ):
ts_sec, ts_usec = map( int, str( time.time() ).split( '.' ) )
length = len( data )
self.pcap_file.write( struct.pack( '@ I I I I', ts_sec,
ts_usec, length, length ) )
self.pcap_file.write( data )
def close(self):
self.pcap_file.close()
class try:
def start(self, packets):
p = Pcap( "PcapData.pcap" )
p.write( str( packets[0] ) )
p.pcap_file.flush()
for packet in packets[1:]:
p = Pcap( "temp.pcap" )
p.write( str( packet ) )
p.pcap_file.flush()
p.close()
os.system( "tail -c +25 temp.pcap >> PcapData.pcap" )
p.close()
我也试过使用text2pcap进行转换,但在我的情况下并不起作用。 mergecap也是一样的。
答案 0 :(得分:0)
您的代码不正确,特别是在启动方法上,请检查此注释
def start(self, packets):
p = Pcap( "PcapData.pcap" )
p.write( str( packets[0] ) )
p.pcap_file.flush()
for packet in packets[1:]:
# You create a pcap file with one packet
p = Pcap( "temp.pcap" )
p.write( str( packet ) )
p.pcap_file.flush()
p.close()
# this os.system is wrong, you can not merge pcap files like that
# you are appending the header file also, use mergepcap
os.system( "tail -c +25 temp.pcap >> PcapData.pcap" )
p.close()
这是一个建议的解决方案
def start(self, packets):
p = Pcap( "PcapData.pcap" )
p.write( str( packets[0] ) )
p.pcap_file.flush()
for packet in packets[1:]:
p.write( str( packet ) )
p.pcap_file.flush()
p.close()