用于读取/写入PCAPNG网络数据包捕获文件的工具。

pcapng的Python项目详细描述


用于读取/写入PCAPNG网络数据包捕获文件的工具

艾伦·汤普森,博科 athomps@brocade.com

请参阅ietf文档PCAP Next Generation (pcapng) Capture File Format

另请参见项目home page on GitLab
at PyPI - the Python Package Index

快速启动

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敏感逻辑。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Android使用两个后台服务错误   解压缩HTTPInputStream时,java GZIPInputStream过早关闭   javax和javax的区别是什么。网ssl。密钥库和服务器。ssl。为SpringBoot应用程序指定密钥库时的密钥库属性   java生成两个JPanel,而我只需要一个   java深度链接从play store安装应用程序时获取数据   java 安卓应用程序在退出时未正确释放蓝牙   java正确使用setCellValueFactory   java开放JdbcTemplate连接处于只读模式?   使用Spring MVC创建服务时发生java错误   JavaFX获取安装在计算机中的特定应用程序的版本   SecureRandom的安全问题:PRNG在java 1.5中不一致   windows我可以创建一个独立的。带Inno设置的Java应用程序的exe安装程序?   如何使用JavaServlet下载csv文件?   java从生成的缓冲图像中添加图像作为jasper中的数据记录?   java日期和时间解析