用于读取/写入PCAPNG网络数据包捕获文件的工具。
pcapng的Python项目详细描述
用于读取/写入PCAPNG网络数据包捕获文件的工具
艾伦·汤普森,博科 athomps@brocade.com
请参阅ietf文档PCAP Next Generation (pcapng) Capture File Format
快速启动
PCAPNG文件必须以节头块开头:
import pcapng.block import pcapng.linktype import pcapng.option pcap_fp = open( 'data.pcapng', 'wb' ); shb_opts = [ pcapng.option.ShbHardware( "Dell" ), pcapng.option.ShbOs( "Ubuntu" ), pcapng.option.ShbUserAppl( "IntelliJ Idea" ) ] shb_obj = pcapng.block.SectionHeaderBlock( shb_opts ) shb_packed_bytes = shb_obj.pack() pcap_fp.write( shb_packed_bytes ) # must be 1st block
其中,对于此块类型或任何其他块类型,可以省略选项列表。shb之后,一个或多个 可以包括接口描述块:
idb_opts = [ pcapng.option.IdbName( interface_name ), pcapng.option.IdbDescription( "primary interface on host" ), pcapng.option.IdbSpeed( 12345 ) ] idb_obj = pcapng.block.InterfaceDescBlock( linktype.LINKTYPE_ETHERNET, idb_opts ) # optional block pcap_fp.write( idb_obj.pack() )
在shb和任何可选idb之后,可以将分组信息作为简单分组包括进来 块或增强包块:
pkt_bytes = get_next_packet( socket_fd ) dbg_print( pkt_bytes ) pcap_fp.write( pcapng.block.SimplePacketBlock( pkt_bytes ).pack() ) pkt_bytes = get_next_packet( socket_fd ) dbg_print( pkt_bytes ) epb_opts = [ pcapng.option.EpbFlags( [13,14,15,16] ), pcapng.option.EpbHash( 'just about any hash spec can go here' ), pcapng.option.EpbDropCount( 13 ) ] pcap_fp.write( pcapng.block.EnhancedPacketBlock( 0, pkt_bytes, len(pkt_bytes), epb_opts ).pack() )
块也可以批量序列化和反序列化,如单元测试中所示:
def test_blocks_lst(): blk_lst = [ # SHB must be 1st block pcapng.block.SectionHeaderBlock( [ pcapng.option.ShbHardware( "Dell" ), pcapng.option.ShbOs( "Ubuntu" ), pcapng.option.ShbUserAppl( "IntelliJ Idea" ) ] ), pcapng.block.InterfaceDescBlock( linktype.LINKTYPE_ETHERNET, [ pcapng.option.IdbName( "Carrier Pigeon" ), pcapng.option.IdbDescription( "Something profound here..." ), pcapng.option.IdbIpv4Addr( [192, 168, 13, 7], [255, 255, 255, 0] ), pcapng.option.IdbOs( 'Ubuntu Xenial 16.04.1 LTS' ) ] ), pcapng.block.SimplePacketBlock('abc'), pcapng.block.EnhancedPacketBlock( 0, "<<<Stand-in for actual packet data>>>" ), pcapng.block.CustomBlockCopyable( pen.BROCADE_PEN, 'User-defined custom data' ), ] packed_bytes = pcapng.block.pack_all( blk_lst ) if False: pcap_fp = open( 'block_list.pcapng', 'wb' ) pcap_fp.write( packed_bytes ) pcap_fp.close() util.assert_block32_length( packed_bytes ) blk_lst_unpacked = pcapng.block.unpack_all( packed_bytes ) assert blk_lst == blk_lst_unpacked
安装
从python包索引(pypi)安装:
sudo pip install pcapng
API文档
将浏览器指向包含的HTML文档:
firefox doc/pcapng/index.html # or similar (system dependent)
示例程序
请参阅示例程序:
isis_agent_pcapng.py # real-time packet capture from your machine into a PCAPNG file isis_demo_mrt.py # same as above but save in Custom Block MRT format pcapng_timing.py # capure 1M sample packets
程序is is_agent_pcapng.py创建一个输出文件data.pcapng,即viewable in Wireshark.
程序isis_demo_mrt.py创建两个输出文件isis.mrt&;isis.pcapng。第一个 Thes是原始MRT格式,Wireshark无法查看。对于第二个文件,每个原始mrt块 包装在PCAPNG自定义块中。可以在wireshark中成功加载该文件;但是, 由于wireshark不了解自定义格式,因此它会生成一个空白显示。
第三个程序pcapng_timing.py向pcapng文件写入100万个伪数据包。旗子选择 简单分组块或增强分组块输出格式。对代理人的处决 对于spb和epb格式,计算机的执行时间分别为~6秒和~16秒。
生成文档
文档使用pdoc工具。请注意,pdoc从安装的 pcapng包,而不是直接从源代码。使用:
sudo pip install pdoc # install pdoc if not present ./generate-docs.bash # generate docs
endian约定
The PCAPNG specification要求将数据保存在 捕获机器的本机endian格式。这避免了可能需要的字节交换 在数据捕获期间,这可能有助于提高效率。然而,pcapng文件的读取器必须 检查节头块的特殊字节顺序幻数字段,以确定 生成文件时使用的endian约定。另外,由于几个pcapng文件可能 连接在一起形成一个更大的、有效的pcapng文件,读取器必须重新计算endian 遇到每个后续节头块的约定。
目前,这个库没有使用本机endian实现对endian敏感的解码逻辑。 用于书写和阅读的编码。因此,库假设捕获机器和 读取器共享相同的endian约定。图书馆将来可能扩展到 实现用于读取在外部主机上写入的PCAPNG的ENDIAN敏感逻辑。