java使用jNetPcap嗅探网络包之windows下配置使用

java使用jNetPcap嗅探网络包之windows下配置使用

2023年7月23日发(作者:)

java使⽤jNetPcap嗅探⽹络包之windows下配置使⽤背景java本⾝是不⽀持处理⽹络层及以下的协议(⽤的java8,可能我了解的少,但好像是这个样⼦)。如果想⽤java做相关的⽹络嗅探开发,需要使⽤⼀些库,⽐如jpcap或JNetPcap。推荐JNetPcap,原因是jpcap很早不维护了,功能上也不如jNetPcap。本⽂会介绍在windows下配置jNetPcap开发环境,如果是linux会再单写⼀篇⽂章说明⼀些问题。jNetPcap简介对于libpcap/winpcap感觉陌⽣的话,可以找⼀些相关资料。我这⾥就简单直⽩的介绍下libpcap/winpcap⽤途:在计算机,流量都是要流经⽹络驱动设备的,如果开发⼈员想要在操作系统抓包,⾃然是要调相关接⼝的,然后就有实验室开发了libpcap,提供了相关接⼝,这样我们开发⼈员就可以⽤c语⾔去调⽤libpcap的相关接⼝来进⾏流量捕获等操作。那winpcap是什么?libpcap是在linux系统上安装的库,winpcap就是windows上安装的。所以,⽐如我们在windows上安装⼀些抓包⼯具,⽐如wireshark,可能会需要安装winpcap,当然⽼的wireshark是⽤winpcap,我前段时间装了个最新版的,装的是另⼀个可以替代并⽀持兼容winpcap的⼀个库,忘了叫啥了,好像pcap什么吧。如果是像在linux安装tcpdump的话,就是装的libpcap,这都是⼀个道理。如果了解elasticsearch栈的⼀个组件packetbeat并⽤过这个款轻量型⽹络数据采集器,应该也明⽩它底层使⽤的⼀个流量捕获⼯具也可以是libpcap,不⼀定⾮得是它,也可以使⽤别的。当然了,在linux下抓包底层依赖库不⼀定都是libpcap,之前有在相关论⽂看到⼀些更优秀的。接下来接着说下java jNetPcap怎么调⽤libpcap/winpcap的。jNetPcap是⽤java语⾔封装的⼀个库,但是它也不是直接就去调⽤libpcap/winpcap的。⽽是提供了⼀个动态连接库:windows下是,linux⾃然是。jNetPcap通过jni调⽤的接⼝,然后的实现再调⽤winpcap接⼝,⼤概就是这么个道理,linux同理。windows下配置1. 安装winpcap,原因看上⾯介绍,怎么安装的,这个话还是上⽹搜⼀吧。2. 配置。这个动态链接库,我给你说下怎么找,⾸先下载,然后解压开这个jar,在下⾯这个⽬录下:linux和windows下的都有。不要在⽹上瞎下载,解压开jar包就⾏,这个jar包我是⽤maven下的。把这个放哪呢,放到jvm系统变量 “”下,不确定在哪,写个代码打印下: public static void main(String[] args) { n(perty("")); }这上⾯出现的⽬录下都⾏,不⼀定是标红线的,我是放到了jdk的bin⽬录下(%JAVA_HOME%bin)。接下来写代码。⽰例代码我⽤的maven,所以先在pom配置这个jar依赖,⽐较幸运的是这个jar包没有额外依赖,不是maven也很省事。 jnetpcap jnetpcap 1.4.r1425-1g 这是我在中央仓库找的最新稳定版了(在linux下也没问题),当然了我⽬前见的最新源码好像都2.0以后了。代码,打印捕捉到的包,注释我尽量写详细点,这个只是demo:package ap;import ;import T;import ;import cket;import ist;import ;/** * Created by 许晓东 on 2020-05-17. */public class JNetPcapDemo { public static void main(String[] args) { start(); } private static final String DEV_NAME = "DeviceNPF_{4F039C40-B2B8-4531-9C75-E6C79FCA3CB9}"; private static void start() { StringBuilder errbuf = new StringBuilder(); // 获得所有⽹卡 List ifs = new ArrayList(); if (lDevs(ifs, errbuf) != 0) { n("No interfaces found"); return; } Pcap pcap = null; //查找要监听的⽹卡进⾏流量嗅探 for (PcapIf i : ifs) { //n(i); gth(0); if ((pcap = ve(e(), 64, _NON_PROMISCUOUS, 1000, errbuf)) == null) { ("Capture open %s: %sn", e(), errbuf .toString()); } // 混杂模式,看源码注释可能被忽略设置.其实我觉得现在也多⽤不到,实际中⽤Java写这个流量嗅探还得是混杂模式的应该不多吧 // 况且说真的,在⽣活中,交换机现在这么智能,混杂模式不好⽤呀。 // 本地环回:NULL, // 通⽤的话如以太⽹卡什么的推荐EN10MB, // 但是可能出现多⽹卡情况,所以过滤条件写复杂点⽐如指定ip呀mac地址什么 // 这只是个demo写的简单了 // 所以实际开发此处需要注意考虑监听⽹上配置,或者尝试启⽤混杂模式 // 我这与这个代码的时候⽤的⽆限⽹卡,我看下值是30,这⾥就写这个30写死了,仅供参考 if (nk() == ue() && gs() == 30) { ("Opened interfacent%snt%sn", e(), i .getDescription()); ("Warnings='%s'n", ng()); break; } else { (); pcap = null; } } if (pcap == null) { n("Unable to find interface"); return; } (_INFINATE, (PcapPacket packet, String userObject) -> { n(userObject); // 打印报⽂ n(packet); }, "xuxd"); n(""); }}然后,刷新了下csdn,下⾯截个图看下,打印的报⽂信息:从传输层以下都有。这个可能⽤处不⼤,有时候需要分析报⽂信息,我捕获⼀个Http报⽂为例:改下代码,对报⽂简单作个处理,获取 http请求的报⽂并打印: (_INFINATE, (PcapPacket packet, String userObject) -> { //n(userObject); // 打印报⽂ //n(packet); // 打印http报⽂ if (der()) { Http http = new Http(); der(http); // 打印请求头 n(http); // 打印请求体 n(new String(load())); } }, "xuxd");打印报⽂如下, ⼀个http响应报⽂:当然了,我写的这个只是demo,看起来⽐较Low,仅供参考

发布者:admin,转转请注明出处:http://www.yc00.com/news/1690105744a306263.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信