一.先装java环境(网上很多)
二.安装libpcap
1.安装GCC:
yum -y install gcc-c++
2.安装flex:
yum -y install flex
没有flex,直接安装libpcap会提示"Your operating system's lex is insufficient to compile libpcap"错误;
3.安装bison
yum -y install bison
前面安装的是flex,就需要搭配bison,如不会提示"don't have both flex and bison;reverting to lex/yacc"错误;
4.安装 libpcap
下载地址:http://www.tcpdump.org/
下载版本:wget -c http://www.tcpdump.org/release/libpcap-1.9.1.tar.gz(也可以装新版的 我装的是1.9的 具体可以去官网下载)
解压软件包:tar zxf libpcap-xxx...
进入解压后的目录,输入命令行:
命令如下:
1). ./configure
2). make
3). make install
5.简单的例子测试一下libpcap:
//新建文件 device.c 下面为内容
#include <stdio.h>
#include <pcap.h>
int main(int argc,char *argv[]){
char *dev, errbuf[PCAP_ERRBUF_SIZE];
dev=pcap_lookupdev(errbuf);
if(dev==NULL){
fprintf(stderr,"couldn't find default device: %s\n",errbuf);
return(2);
}
printf("Device: %s\n",dev);
return(0);
}
编译指令:gcc -o device device.c -lpcap (执行成功会生成一个可执行文件)
备注:编译时要使用libpcap的参数-lpcap,否则会提示“pcap_lookupdev 未定义的引用”的错误;
运行指令:./device
运行成功为显示个0什么玩意 我忘记了 不报错就行!
运行遇到错误解决办法:
error while loading shared libraries: libpcap.so.1: cannot open shared object file: No such file or xxx
由于libpcap已经安装,所以是程序无法找到库所在的位置的原因。
解决办法:将libpcap.so.1所在目录添加到文件/etc/ld.so.conf中
打开ld.so.conf文件,然后添加一行/usr/local/lib 改成
includeld.so.conf.d/*.conf //原来的内容
/usr/local/lib
然后保存,再终端下执行 ldconfig。
再运行sniff程序,OK。
--------------网上还有其他错误解决方案,其他的可以去问百度--------------
三、安装Jpcap
需要先下载项目 :https://download.csdn.net/download/qq_38806714/12563966 有积分直接下载 没有的话私信我留下邮箱
1.编译: 在./Jpcap/src/main/c中,执行
make
生成libjpcap.so文件(到这里生成成功后基本上就可以用了,网上代码很多 随意一个都行,调用方式大同小异)。
这里有些人会报错 参考 https://blog.csdn.net/qqaazz211/article/details/78984953 可以使用指令
2. 将生成的libjpcap.so文件拷贝到 $JAVA_HOME/jre/lib/amd64目录下;
将 ./Jpcap/lib/jpcap.jar 拷到 $JAVA_HOME/jre/lib/ext目录下【jpcap.jar开始是复制到$JAVA_HOME/lib,但是不行就换成这个目录了】
3.网上找的一个测试代码(项目里面也有测试类 需要编译后测试),是测网卡流量的:
import java.io.IOException;
import java.util.Scanner;
import jpcap.*;
import jpcap.packet.*;
public class NetFetcher implements PacketReceiver{
@Override
public void receivePacket(Packet arg0) {
//将抓取的包进行输出
System.out.println(arg0.caplen);
TCPPacket tcp = (TCPPacket) arg0;
System.out.println("请求ip:" + tcp.src_ip + ",目标ip:" + tcp.dst_ip);
System.out.println("数据:");
System.out.println("**********************************");
//for (int i = 0; i < tcp.data.length; i++) {
//System.out.print((char) tcp.data[i]);
//}
//System.out.println(new String(tcp.data));
}
public static void main(String[] args){
//获得网卡设备列表
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
if(devices.length==0){
System.out.println("无网卡信息!");
return;
}
//输出网卡信息
for(int i=0;i<devices.length;i++){
System.out.println("网卡"+i+"信息:"+devices[i].name);
for(NetworkInterfaceAddress address:devices[i].addresses){
System.out.print(address.address+" ");
}
System.out.println("\n");
}
Scanner scan = new Scanner(System.in);
System.out.println("请选择您要监听的网卡序号:");
int index = scan.nextInt();
//监听选中的网卡
try {
JpcapCaptor jpcapCaptor = JpcapCaptor.openDevice(devices[index], 2000, false, 20);
jpcapCaptor.loopPacket(-1, new NetFetcher());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}