Java抓包分析二(基于jnetpcap进行抓包)——快速入门案例

我们所使用的依赖包是1.4.r1425-1g版本,但是没找到这块的源码和对应的API文档,所以文档展示采用1.4.r1300。

1.包目录结构说明

在这里插入图片描述
如下整理的是1.4.r1300版本,总体差距变化和1.4.r1425-1g不是特别大

核心功能
org.jnetpcap核心 libpcap 功能可在所有平台上使用。
org.jnetpcap.nio本机内存和 IO 管理类
org.jnetpcap.packet数据包解码框架
org.jnetpcap.packet.annotate头定义的注解接口
org.jnetpcap.packet.formatJPacket 和 JHeader 对象的格式化类
org.jnetpcap.packet.structure描述其结构的数据包、标头、字段、绑定和扫描器原语
org.jnetpcap.protocol网络协议和头定义
org.jnetpcap.protocol.application应用程序协议套件
org.jnetpcap.protocol.lanLAN 协议套件
org.jnetpcap.protocol.network网络协议套件
org.jnetpcap.protocol.tcpipTcp/Ip 协议套件
org.jnetpcap.protocol.voipIP 语音协议家族
org.jnetpcap.protocol.vpnVPN 协议套件
org.jnetpcap.protocol.wanWAN 协议套件
org.jnetpcap.util各种支持实用方法
org.jnetpcap.util.checksum循环冗余校验和算法
org.jnetpcap.util.config配置使用属性
org.jnetpcap.util.resolver人工标签解析器的地址
org.jnetpcap.winpcapWinPcap 对 libpcap 的扩展,可在有限的平台集上使用

2.Pcap

这个类是与 libpcap 和 winpcap 库实现中的原生 pcap_t 结构对等的Java类。 它提供了Java 与libpcap 库方法的直接映射。

2.1.入门了解

Pcap 类提供了几个静态方法,它们允许发现网络接口,然后打开 openLive、openDead 或 openOffline pcap 捕获会话。在所有 3 种情况下,都会返回 Pcap 对象。该对象由 Java VM 地址空间之外的 C pcap_t 结构支持。 Pcap 对象上的任何非静态操作都使用 java JNI API 转换为相应的 Libpcap C 调用,并提供适当的 pcap_t C 结构来完成调用。

从上述静态方法获取 Pcap 对象后,您必须调用 close() 调用以释放任何 Libpcap 资源和支持的 C 结构。 Pcap 对象确实从其 finalize() 方法中隐式调用了 close() 方法,但这只会在 Pcap 被垃圾收集时发生。当不再需要 Pcap 对象和捕获会话时,记住始终调用 close() 的最佳实践。

如果 Pcap 对象关闭并调用其任何非静态方法,则关闭后将抛出 IllegalStateException。

2.2.获取网卡(网络适配器)

与 libpcap 一样,我们首先要找出并获取网络接口名称,以便我们可以告诉 jnetpcap打开一个或多个以供读取。 所以首先我们查询系统上的接口列表:
这个案例已经在我们搭建环境中进行演示了
Java抓包分析一(基于jnetpcap进行抓包)——抓包环境搭建,获取网卡
Pcap.findAllDevs

/**
	 * @Description:获取网络适配器,当返回List<PcapIf>为空时,说明未获取到网卡
	 * @author:hutao
	 * @mail:hutao_2017@aliyun.com
	 * @date:2021年9月2日
	 */
	public static List<PcapIf> getPcapIf() {
		StringBuilder errbuf = new StringBuilder();
		//定义网卡列表
		List<PcapIf> ifs = new ArrayList<PcapIf>(); 
		/* 返回值是一个整数结果代码,就像在 C 计数器部分一样。
		 * ifs 列表中填充了从 C 函数调用 findAllDevs 返回的相应 C 结构 pcap_if 链表中找到的所有网络设备。
		 */
		int statusCode = Pcap.findAllDevs(ifs, errbuf);
		if(statusCode != Pcap.OK){
			System.err.println("获取网卡失败:" + errbuf.toString());
		}
		return ifs;
    }

2.3.抓包处理器Handler

定义一个处理器,需要实现PcapPacketHandler来处理我们的抓包逻辑。

public class CustomPcapHandler<Object> implements PcapPacketHandler<Object>{
	@Override
	//不做任何处理,仅作数据打印
	public void nextPacket(PcapPacket packet, Object user) {
		System.out.println(packet);
	}
}

2.4.监控指定网卡进行抓包

openLive
给定制定的网卡(网络适配器)进行抓包

/**
	 * @Description:开始捕获数据包
	 * @param
	 * @author:hutao
	 * @mail:hutao_2017@aliyun.com
	 * @date:2021年9月2日
	 */
	public static void capturePcap(PcapIf device) {
		//截断此大小的数据包
		int snaplen = Pcap.DEFAULT_JPACKET_BUFFER_SIZE;
		
		int promiscous = Pcap.MODE_PROMISCUOUS;
		
		//以毫秒为单位
		int timeout = 60 * 1000; 
		//如果发生错误,它将保存一个错误字符串。 错误打开 Live 将返回 null
		StringBuilder errbuf = new StringBuilder();
		
		Pcap pcap = Pcap.openLive(device.getName(),snaplen,promiscous,timeout,errbuf);
		if(pcap == null) {
			System.err.println("获取数据包失败:" + errbuf.toString());
		}
		
		CustomPcapHandler<Object> handler = new CustomPcapHandler<Object>();
		// 捕获数据包计数
		int cnt = 1;
		//我们要发送到处理程序的自定义对象
		PrintStream out = System.out;
		while(true) {
			//每个数据包将被分派到抓包处理器Handler
			pcap.loop(cnt, handler, out);
		}
		//pcap.close();
	}

3.完整代码示例

3.1.CustomPcapHandler

import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.PcapPacketHandler;
import org.jnetpcap.protocol.tcpip.Http;
public class CustomPcapHandler<Object> implements PcapPacketHandler<Object>{
	@Override
	public void nextPacket(PcapPacket packet, Object user) {
		System.out.println(packet);
	}
}

3.2.CaptureUtils

import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;
import com.capture.hutao.packetHandler.CustomPcapHandler;

/**
 * @Description:抓包工具类
 * @author:hutao
 * @mail:hutao_2017@aliyun.com
 * @date:2021年9月2日
 */
public class CaptureUtils {
	
	/**
	 * @Description:获取网络适配器,当返回List<PcapIf>为空时,说明未获取到网卡
	 * @author:hutao
	 * @mail:hutao_2017@aliyun.com
	 * @date:2021年9月2日
	 */
	public static List<PcapIf> getPcapIf() {
		StringBuilder errbuf = new StringBuilder();
		//定义网卡列表
		List<PcapIf> ifs = new ArrayList<PcapIf>(); 
		/* 返回值是一个整数结果代码,就像在 C 计数器部分一样。
		 * ifs 列表中填充了从 C 函数调用 findAllDevs 返回的相应 C 结构 pcap_if 链表中找到的所有网络设备。
		 */
		int statusCode = Pcap.findAllDevs(ifs, errbuf);
		if(statusCode != Pcap.OK){
			System.err.println("获取网卡失败:" + errbuf.toString());
		}
		return ifs;
    }
	
	/**
	 * @Description:开始捕获数据包
	 * @param
	 * @author:hutao
	 * @mail:hutao_2017@aliyun.com
	 * @date:2021年9月2日
	 */
	public static void capturePcap(PcapIf device) {
		//截断此大小的数据包
		int snaplen = Pcap.DEFAULT_JPACKET_BUFFER_SIZE;
		
		int promiscous = Pcap.MODE_PROMISCUOUS;
		
		//以毫秒为单位
		int timeout = 60 * 1000; 
		//如果发生错误,它将保存一个错误字符串。 错误打开 Live 将返回 null
		StringBuilder errbuf = new StringBuilder();
		
		Pcap pcap = Pcap.openLive(device.getName(),snaplen,promiscous,timeout,errbuf);
		if(pcap == null) {
			System.err.println("获取数据包失败:" + errbuf.toString());
		}
		
		CustomPcapHandler<Object> handler = new CustomPcapHandler<Object>();
		// 捕获数据包计数
		int cnt = 1;
		//我们要发送到处理程序的自定义对象
		PrintStream out = System.out;
		while(true) {
			//每个数据包将被分派到抓包处理器Handler
			pcap.loop(cnt, handler, out);
		}
		//pcap.close();
	}
}

3.3.DemoTest

import java.util.List;
import org.jnetpcap.PcapIf;
import com.capture.hutao.utils.CaptureUtils;

public class DemoTest {
	public static void main(String[] args) {
		List<PcapIf> networkAdapter = CaptureUtils.getPcapIf();
		CaptureUtils.capturePcap(networkAdapter.get(0));
	}
}

3.4.效果显示

在这里插入图片描述

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
lsposed是一种在Android系统上进行Xposed框架模块注入的工具,它可以让用户在不修改系统源码的情况下实现对系统应用或第三方应用的定制和修改。 对于lsposed的抓包功能,它主要用于截获应用程序与服务器之间的通信数据,以便进行分析和调试。使用lsposed进行抓包,可以帮助开发者或安全研究人员深入了解应用程序的通信协议和数据传输过程,发现潜在的安全风险和漏洞,从而进行安全加固或改进。 在使用lsposed进行抓包前,首先需要在手机上安装lsposed框架,并确保手机已经root。接下来,可以通过安装支持抓包的Xposed模块,如JustTrustMe,来实现对应用程序的数据抓包。安装完模块后,重启手机并启用JustTrustMe模块。 启用JustTrustMe后,当Android应用程序与服务器通信时,JustTrustMe会拦截通信请求,并生成一个自签名的证书来替代原本应用程序所使用的证书。这样,应用程序与服务器之间的通信数据就会经过JustTrustMe进行中间人攻击,并被抓包工具记录下来。 抓包工具可以将通信数据保存为文件或在客户端显示,并提供详细的请求和响应信息,如URL、参数、头部信息和响应内容。通过分析这些数据,可以了解应用程序的通信方式、数据传输的加密与解密过程,以及可能存在的漏洞和攻击路径。 但需要注意的是,使用lsposed进行抓包是一种针对个人学习和研究的行为,未经授权的非法使用可能会侵犯他人的隐私和安全。在进行抓包时,务必遵循法律法规和道德规范。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值