pcap linktype 101的报文转为linktype 1的报文

pcap报文格式参考1

LinkType:4B链路类型
常用类型:
1            Ethernet, and Linux loopback devices

101         “raw IP”, with no link

这两种报文在wireshark里都可以解析,但大部分的其他处理软件,如pcap_flow(github项目), xcap,科来(即便转变为libpcap也不行),都对101的这种报文表示不支持。

tcpreplay也不支持101,会导致回放报文有问题。

想想也对的,101没有链路信息,上来就是ip层报文,确实不能回放。说明这几个家都是互相抄,bug都抄成一样的了。FIXME

怎么将101的报文加为1的,即加上链路层呢?这里只展示手工的做法,

原始文件内容hexdump radius-response.pcap

0000000 c3d4 a1b2 0002 0004 0000 0000 0000 0000
0000010 ffff 0000 0065 0000 41ad 4d61 2ccf 000e
0000020 0030 0000 0030 0000 0045 3000 1338 0040
0000030 11fe 702f 000a ad00 920a faff 1507 5608
0000040 1c00 1c9e 1705 1400 ac78 5200 5c5d d987
0000050 effa 4b82 5db0 fcab                    
0000058

编辑后文件hexdump radius-response-ll.pcap
0000000 c3d4 a1b2 0002 0004 0000 0000 0000 0000
0000010 ffff 0000 0001 0000 41ad 4d61 2ccf 000e
0000020 003e 0000 003e 0000 3412 7856 3412 7856
0000030 3412 7856 0008 0045 3000 1338 0040 11fe
0000040 702f 000a ad00 920a faff 1507 5608 1c00
0000050 1c9e 1705 1400 ac78 5200 5c5d d987 effa
0000060 4b82 5db0 fcab                         
0000066


添加mac层(ethernet)的步骤

1 使用OKteta(一种linux二进制编辑器)打开原始文件

2 linktype从101改为1

方法:将0x15(hexdump显示的位置为0x15,但OKteta显示的为0x14位置,下面位置处都以hexdump为准,但修改变动内容以Okteta为准)从65改为01

3 增加dst mac, src mac, l2 ip proto, 假设目标mac是1234 5678 1234(即1234.5678.1234),源mac是 5678.1234.5678, IP是0800

方法:在0x28的4500前插入1234 5678 1234 5678 1234 5678 0800

4 由于增加了mac层,所以pcap文件头的caplen和len都要改变。caplen和len原来在4500之前,现在中间插入了步骤3的内容。

增加的长度即插入的步骤3新增内容的长度,即14字节(6mac,6mac,2ip-proto)

例子中将0x20处的,0030 0000 0030 0000分别对应4字节caplen和4字节len,分别加14字节,变为003e 0000 003e 0000


参考

1 http://www.cnblogs.com/hnrainll/archive/2012/06/17/2552943.html

Pcap4J是一个基于Java的开源库,用于处理网络数据包捕获和分析。尽管它主要用于数据包捕获,但它也可以用于发送报文。 要使用Pcap4J发送报文,首先需要创建一个PcapHandle对象,该对象用于发送和接收数据包。然后,可以使用PcapHandle的sendPacket方法来发送报文。 发送报文的过程类似于捕获报文的过程。首先,需要创建一个Packet对象,该对象代表要发送的报文报文可以是手动创建的,也可以通过解析现有的数据来创建。 创建一个手动报文的示例代码如下: ```java EthernetPacket.Builder etherBuilder = new EthernetPacket.Builder(); etherBuilder.dstAddr(MacAddress.getByName("00:11:22:33:44:55")) .srcAddr(MacAddress.getByName("AA:BB:CC:DD:EE:FF")) .type(EtherType.IPV4); Packet etherPacket = etherBuilder.build(); IpV4Packet.Builder ipV4Builder = new IpV4Packet.Builder(); ipV4Builder.version(IpVersion.IPV4) .tos(IpV4Rfc791Tos.newInstance((byte) 0)) .identification((short) 100) .srcAddr(InetAddress.getByName("192.168.0.1")) .dstAddr(InetAddress.getByName("192.168.0.2")) .protocol(IpNumber.TCP) .ttl((byte) 100) .payloadBuilder(new UnknownPacket.Builder().rawData(new byte[] { 0x00 })) .correctChecksumAtBuild(true) .correctLengthAtBuild(true); Packet ipPacket = ipV4Builder.build(); // 构造报文 Packet.Builder packetBuilder = new Packet.Builder(); packetBuilder.dstAddr(MacAddress.getByName("00:11:22:33:44:55")) .srcAddr(MacAddress.getByName("AA:BB:CC:DD:EE:FF")) .ethType(EtherType.IPV4) .payloadBuilder(ipV4Builder) .paddingAtBuild(true); Packet packet = packetBuilder.build(); PcapHandle handle = Pcaps.openOffline("file.pcap"); // 发送报文 handle.sendPacket(packet); ``` 通过解析现有数据来创建报文的流程比较复杂,需要分析数据包的结构,并逐个字段构造报文。 在发送完报文后,需要记得关闭PcapHandle对象,以释放资源。 以上是使用Pcap4J发送报文的简单示例代码,使用这个库可以方便地发送报文,并进行进一步的网络数据包处理和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值