java抓包后对pcap文件解析示例
发布时间:2022-11-23 20:21:53
这是自己写的简单的解析pcap文件,方便读取pcap文件,大家参考使用吧
InputStream is = DataParser.class.getClassLoader().getResourceAsStream("baidu_cdr.pcap");
Pcap pcap = PcapParser.unpack(is);
is.close();
byte[] t = pcap.getData().get(0).getContent();
byte[] data = Arrays.copyOfRange(t, 42, t.length);
PcapParser.java
package com.hylanda.pcap;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhouqisheng
*
*/
public class PcapParser {
public static Pcap unpack(InputStream is) throws IOException {
Pcap pcap = null;
byte[] buffer_4 = new byte[4];
byte[] buffer_2 = new byte[2];
pcap = new Pcap();
PcapHeader header = new PcapHeader();
int m = is.read(buffer_4);
if(m != 4){
return null;
}
reverseByteArray(buffer_4);
header.setMagic(byteArrayToInt(buffer_4, 0));
m = is.read(buffer_2);
reverseByteArray(buffer_2);
header.setMagor_version(byteArrayToShort(buffer_2, 0));
m = is.read(buffer_2);
reverseByteArray(buffer_2);
header.setMinor_version(byteArrayToShort(buffer_2, 0));
m = is.read(buffer_4);
reverseByteArray(buffer_4);
header.setTimezone(byteArrayToInt(buffer_4, 0));
m = is.read(buffer_4);
reverseByteArray(buffer_4);
header.setSigflags(byteArrayToInt(buffer_4, 0));
m = is.read(buffer_4);
reverseByteArray(buffer_4);
header.setSnaplen(byteArrayToInt(buffer_4, 0));
m = is.read(buffer_4);
reverseByteArray(buffer_4);
header.setLinktype(byteArrayToInt(buffer_4, 0));
pcap.setHeader(header);
List<PcapData> dataList = new ArrayList<PcapData>();
while (m > 0) {
PcapData data = new PcapData();
m = is.read(buffer_4);
if (m < 0) {
break;
}
reverseByteArray(buffer_4);
data.setTime_s(byteArrayToInt(buffer_4, 0));
m = is.read(buffer_4);
reverseByteArray(buffer_4);
data.setTime_ms(byteArrayToInt(buffer_4, 0));
m = is.read(buffer_4);
reverseByteArray(buffer_4);
data.setpLength(byteArrayToInt(buffer_4, 0));
m = is.read(buffer_4);
reverseByteArray(buffer_4);
data.setLength(byteArrayToInt(buffer_4, 0));
byte[] content = new byte[data.getpLength()];
m = is.read(content);
data.setContent(content);
dataList.add(data);
}
pcap.setData(dataList);
return pcap;
}
private static int byteArrayToInt(byte[] b, int offset) {
int value = 0;
for (int i = 0; i < 4; i++) {
int shift = (4 - 1 - i) * 8;
value += (b[i + offset] & 0x000000FF) << shift;
}
return value;
}
private static short byteArrayToShort(byte[] b, int offset) {
short value = 0;
for (int i = 0; i < 2; i++) {
int shift = (2 - 1 - i) * 8;
value += (b[i + offset] & 0x000000FF) << shift;
}
return value;
}
/**
* 反转数组
* @param arr
*/
private static void reverseByteArray(byte[] arr){
byte temp;
int n = arr.length;
for(int i=0; i<n/2; i++){
temp = arr[i];
arr[i] = arr[n-1-i];
arr[n-1-i] = temp;
}
}
}
Pcap.java
/**
*
*/
package com.hylanda.pcap;
import java.util.List;
/**
* @author zhouqisheng
*
*/
public class Pcap {
private PcapHeader header;
private List<PcapData> data;
public PcapHeader getHeader() {
return header;
}
public void setHeader(PcapHeader header) {
this.header = header;
}
public List<PcapData> getData() {
return data;
}
public void setData(List<PcapData> data) {
this.data = data;
}
@Override
public String toString(){
StringBuilder s = new StringBuilder();
s.append("header{\n");
s.append(header.toString());
s.append("}\n");
s.append("data part count=").append(data.size());
return s.toString();
}
}
PcapData.java
package com.hylanda.pcap;
/**
* @author zhouqisheng
* 数据包头
*/
public class PcapData {
private int time_s;//时间戳(秒)
private int time_ms;//时间戳(微妙)
private int pLength;//抓包长度
private int length;//实际长度
private byte[] content;//数据
public int getTime_s() {
return time_s;
}
public void setTime_s(int time_s) {
this.time_s = time_s;
}
public int getTime_ms() {
return time_ms;
}
public void setTime_ms(int time_ms) {
this.time_ms = time_ms;
}
public int getpLength() {
return pLength;
}
public void setpLength(int pLength) {
this.pLength = pLength;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
@Override
public String toString(){
StringBuilder s = new StringBuilder();
s.append("time_s=").append(this.time_s);
s.append("\ntime_ms=").append(this.time_ms);
s.append("\npLength=").append(this.pLength);
s.append("\nlength=").append(this.length);
return null;
}
}
PcapHeader.java
package com.hylanda.pcap;
/**
* @author zhouqisheng
* pcap文件头
*/
public class PcapHeader {
private int magic;//文件识别头,为0xA1B2C3D4
private short magor_version;//主要版本
private short minor_version;//次要版本
private int timezone;//当地标准时间
private int sigflags;//时间戳的精度
private int snaplen;//最大的存储长度
/**
* 0 BSD loopback devices, except for later OpenBSD
1 Ethernet, and Linux loopback devices
6 802.5 Token Ring
7 ARCnet
8 SLIP
9 PPP
10 FDDI
100 LLC/SNAP-encapsulated ATM
101 “raw IP”, with no link
102 BSD/OS SLIP
103 BSD/OS PPP
104 Cisco HDLC
105 802.11
108 later OpenBSD loopback devices (with the AF_value in network byte order)
113 special Linux “cooked” capture
114 LocalTalk
*/
private int linktype;//链路类型
public int getMagic() {
return magic;
}
public void setMagic(int magic) {
this.magic = magic;
}
public short getMagor_version() {
return magor_version;
}
public void setMagor_version(short magor_version) {
this.magor_version = magor_version;
}
public short getMinor_version() {
return minor_version;
}
public void setMinor_version(short minor_version) {
this.minor_version = minor_version;
}
public int getTimezone() {
return timezone;
}
public void setTimezone(int timezone) {
this.timezone = timezone;
}
public int getSigflags() {
return sigflags;
}
public void setSigflags(int sigflags) {
this.sigflags = sigflags;
}
public int getSnaplen() {
return snaplen;
}
public void setSnaplen(int snaplen) {
this.snaplen = snaplen;
}
public int getLinktype() {
return linktype;
}
public void setLinktype(int linktype) {
this.linktype = linktype;
}
@Override
public String toString(){
StringBuilder s = new StringBuilder();
s.append("magic=").append("0x" + Integer.toHexString(this.magic));
s.append("\nmagor_version=").append(this.magor_version);
s.append("\nminor_version=").append(this.minor_version);
s.append("\ntimezone=").append(this.timezone);
s.append("\nsigflags=").append(this.sigflags);
s.append("\nsnaplen=").append(this.snaplen);
s.append("\nlinktype=").append(this.linktype);
return s.toString();
}
}
猜你喜欢
- 前言之前在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务
- 先来看我们以前利用RestTemplate发起远程调用的代码:存在下面的问题:代码可读性差,编程体验不统一参数复杂URL难以维护1. Fei
- 题外话: 泛型与通配符是Java语法中比较难懂的两个语法,学习泛型和通配符的主要目的是能够看懂源码,实际使用的不多。1.泛型1.1泛型的用法
- 前言二进制文件读写两个重要的函数 , fread 和 fwrite , fread 用于读取文件 , fwrite 用于写出文件 ;frea
- 前言在一些项目中,经常会遇到需要把当前线程中的上下文传递到其他线程中的情况,比如某项目包含国际化操作,在业务请求进来时需要把对应的国家代码存
- 折半插入排序折半插入排序是对直接插入排序的简单改进。此处介绍的折半插入,其实就是通过不断地折半来快速确定第i个元素的插入位置,这实际上是一种
- 一.摘要emmmm..对springmvc不太熟练的情况下,如果不出意外的话,项目启动后出现404页面是很烦人。在这里,我记录一下可能会导致
- java 算法之希尔排序一、思想 希尔排序:使数组中任意间隔为h的元素都是有序的。在进行排序的时候,如果h很大,我们就能将元素移动到很远的地
- 1.雪崩效应 雪崩效应如上图所示,假设我们有3个微服务A,B,C,A调用B,B调用C,如果C挂掉了,由于B是同步调用,不断等待,导致资源耗尽
- 本文实例为大家分享了javaOpenCV-4.0.0 实时人脸识别,供大家参考,具体内容如下package com.xu.opencv;im
- 1安装eclipse插件步骤,点击help,选择Eclipse Marketplace2.输入Scala,点击go3.选择搜索到的Scala
- 1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchr
- Java接口(interface)的概念及使用在抽象类中,可以包含一个或多个抽象方法;但在接口(interface)中,所有的方法必须都是抽
- 背景介绍你刚从学校毕业后,到新公司实习,试用期又被毕业,然后你又不得不出来面试,好在面试的时候碰到个美女面试官!面试官: 小伙子,
- 在 C# 以二进制形式读取数据时使用的是 BinaryReader 类。BinaryReader 类中提供的构造方法有 3 种,具体的语法形
- 网络唤醒实现了对网络的集中管理,即在任何时刻,网管中心的IT管理人员可以经由网络远程唤醒一台处于休眠或关机状态的计算机。使用这一功能,IT管
-   考虑到直接讲实现一个类Task库思维有点跳跃,所以本节主要讲解Async/Await的本质作用(解决
- Java多态对象的类型转换这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时,j
- java调用外部程序的方法 在一个java应用中,可能会遇到这样的需求,就是需要调用一些外部的应用做一些处理,比如调用excel,
- spring validation多层对象校验1、第一层对象定义import java.io.Serializable; import ja