抓包插件

java抓取网卡请求的数据包,我使用了jnetpcap包,现集成到jfinal中如下:


目录:

image.png



class:

package com.raiyi.plugin;

import java.util.ArrayList;
import java.util.List;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;

import com.jfinal.kit.LogKit;
import com.jfinal.plugin.IPlugin;
import com.raiyi.service.PcapPacketHandlerService;

/**
 * 抓包插件,是否抓包---抓取哪个网卡的包?????????????最好写成可配置的
 * 
 * @author Nana
 *
 */
public class NetPcapPlugin implements IPlugin {

	boolean uf = true;

	public NetPcapPlugin() {
	}

	public NetPcapPlugin(boolean useFlag) {
		this.uf = useFlag;
	}

	/**
	 * 获取第二个网卡的请求包信息
	 * 
	 * @return
	 */
	private boolean pcap() {
		return pcap(1);
	}

	/**
	 * 获取指定网卡的请求包信息
	 * 
	 * @param d
	 * @return
	 */
	@SuppressWarnings("deprecation")
	private boolean pcap(int d) {
		if (uf) {
			try {
				List<PcapIf> alldevs = new ArrayList<PcapIf>(); // alldevs用来装载所有的network
				// interface card,
				StringBuilder errbuf = new StringBuilder(); // 获取错误信息

				/***************************************************************************
				 * 首先我们要来获取系统中的设备列表
				 **************************************************************************/
				int r = Pcap.findAllDevs(alldevs, errbuf);
				/**
				 * 这个方法构造了可以用pcap_open_live()打开的所有网络设备 这个列表中的元素都是 pcap_if_t,
				 * name 一个指向设备名字的指针; adderess 是一个接口的地址列表的第一个元素的指针; flag
				 * 一个PCAP_IF_LOOPBACK标记接口是否是loopback的 失败返回-1,成功返回0
				 */

				if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
					// 如果获取失败,或者获取到列表为空,则输出错误信息,退出
					LogKit.error("Can't read list of devices, error is " + errbuf.toString());
					return false;
				}
				LogKit.info("Network devices found:");
				int i = 0; // 遍历所有的设备
				for (PcapIf device : alldevs) {
					String description = (device.getDescription() != null) ? device.getDescription()
							: "No description available"; // 如果该设备介绍,则输出介绍
					LogKit.info("第" + i++ + "个设备名称: " + device.getName() + ", 描述: " + description);
				}

				PcapIf device = alldevs.get(1); // 这里在测试的时候可以根据你的可用网卡号自主判断
				LogKit.info(
						"Choosing '" + ((device.getDescription() != null) ? device.getDescription() : device.getName())
								+ "' on your behalf:");

				/***************************************************************************
				 * 打开我们选中的设备
				 **************************************************************************/
				int snaplen = 64 * 1024;
				int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
				int timeout = 10 * 1000; // 10 seconds in millis
				Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);

				if (pcap == null) { // 如果获取的pcap是null,则返回相关的错误信息
					LogKit.error("Error while opening device for capture: " + errbuf.toString());
					return false;
				}

				/***************************************************************************
				 * 
				 * 第三步我们创建一个packet handler 处理器来从libpcap loop中接收数据包
				 **************************************************************************/
				PcapPacketHandlerService pphService = new PcapPacketHandlerService();
				pcap.loop(-1, pphService, "pack user info");
				pcap.close();
			} catch (Exception e) {
				e.printStackTrace();
				return false;
			}
		}
		return true;
	}

	@Override
	public boolean start() {
		return pcap();
	}

	@Override
	public boolean stop() {
		return false;
	}

}


package com.raiyi.service;

import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.PcapPacketHandler;

public class PcapPacketHandlerService implements PcapPacketHandler<String> {

	@Override
	public void nextPacket(PcapPacket packet, String msg) {
		System.out.println(packet);
		System.out.println();
		System.out.println();
		System.out.println();
		System.out.println();
		System.out.println();
	}
}





使用到的jar包:

		<!-- https://mvnrepository.com/artifact/jnetpcap/jnetpcap -->
		<dependency>
			<groupId>jnetpcap</groupId>
			<artifactId>jnetpcap</artifactId>
			<version>1.4.r1425-1f</version>
		</dependency>




注意:只能在window下运行,因为要加载dll动态库,将两个dll文件存放jdk/bin和jre/bin下:

image.png

image.png




运行结果:image.png


jnetpcap.dll、jnetpcap-pcap100.dll两个文件网上有资源

评论区

JFinal

2018-05-16 11:13

项目开源不?

tom_b

2018-05-16 11:52

开源的,项目地址:https://pan.baidu.com/s/14rBwtMnpizyKI5giAbevAw,提取码zip7,写的不好请见谅

JFinal

2018-05-16 12:18

@tom_b 开源放 gitee.com 或者 github.com 才最好

马小酱

2018-05-27 21:45

建议把最终运行成果展示一下

tom_b

2018-05-31 09:50

热门分享

扫码入社