• jpcap抓包心得


    jpcap没有64位版的?这样就不得不用32的系统了。
    用jpcap抓包,前提是装好了winpcap和jpcap。

    过程很简单:
    1.JpcapCaptor.getDeviceList()获取网卡列表,返回一个jpcap.NetworkInterface的数组
    2.选择网卡,调用JpcapCaptor.openDevice(),返回一个JpcapCaptor类的对象。
    3.创建PacketReceiver类的对象用来接收抓到的包,要覆写receivePacket()这个方法。
    4.用JpcapCaptor的processPacket()方法执行抓包。

    具体的参数见api

    我就针对网络层是ip协议的包的抓取写了个程序,只是为了试验下,所以没有gui,在eclipse下跑跑还行,需要手动结束程序。
    下面是抓到的东西:(源代码在最后)

    src: /192.168.1.100
    dst: /192.168.1.1
    head: 54E6FC35DDA8701A04B54D7308004500003D1F3A0000801197C0C0A80164C0A80101F8AB00350029F9A7
    data: 9482010000010000000000000373646C073336307361666503636F6D0000010001

    src: /192.168.1.100
    dst: /192.168.1.1
    head: 54E6FC35DDA8701A04B54D7308004500003E1F3B0000801197BEC0A80164C0A80101FE6A0035002A6A75
    data: 22630100000100000000000002627004636F6E6601660333363002636E0000010001

    src: /192.168.1.100
    dst: /192.168.1.1
    head: 54E6FC35DDA8701A04B54D730800450000471F3C0000801197B4C0A80164C0A80101DD0B003500334ACD
    data: FED8010000010000000000000674657265646F0469707636096D6963726F736F667403636F6D0000010001

    src: /192.168.1.100
    dst: /192.168.1.1
    head: 54E6FC35DDA8701A04B54D7308004500003F1F3D0000801197BBC0A80164C0A80101F65C0035002B67DE
    data: 77880100000100000000000002627005636F6E663201660333363002636E0000010001

    /*
    *
    */
    package org.wen;
    import jpcap.*;
    import jpcap.packet.*;
    import java.io.*;
    import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
    public class Capture {
    //将抓包信息存入文件中。
    File file=null;
    String str=null;
    static FileOutputStream fos=null;
    //设备、捕获器和包
    jpcap.NetworkInterface[] devices=null;
    JpcapCaptor captor=null;
    Packet packet=null;
    PacketReceiver receiver=null;
    //字节到16进制的转换器,将包以16进制形式展现
    HexBinaryAdapter hba=null;
    //MAC类型
    byte[] pro=null;
    //抓包函数
    public void startCapture(){
    while(captor!=null){
    captor.processPacket(1, receiver);
    }
    }
    public Capture() throws IOException{
    pro=new byte[2];
    hba=new HexBinaryAdapter();
    file=new File("./ipdata.txt");
    if(!file.exists()){
    file.createNewFile();
    }
    fos=new FileOutputStream(file);
    devices=JpcapCaptor.getDeviceList();
    //注意,我的电脑第一个是有线网卡,第二个是无线的,这里devices[1]是有线的以太网卡
    captor=JpcapCaptor.openDevice(devices[1], 1514, true, 50);
    //接收抓到的包,覆写下面这个方法来实现将抓到的包写入文件中
    receiver = new PacketReceiver() {
    @Override
    public void receivePacket(Packet packet) {
    // TODO Auto-generated method stub
    try{
    str="";
    //获得网络协议类型
    pro[0]=packet.header[12];
    pro[1]=packet.header[13];
    //这里暂且只抓ip包了
    if(hba.marshal(pro).toString().equals("0800")){
    str+="src: ";
    str+=((IPPacket)packet).src_ip.toString();
    str+="\n";
    str+="dst: ";
    str+=((IPPacket)packet).dst_ip.toString();
    str+="\n";
    str+="head: ";
    str+=hba.marshal(packet.header);
    str+="\n";
    str+="data: ";
    str+=hba.marshal(packet.data);
    str+="\n\n";
    }else{
    str+="a non-ip packet\n\n";
    }
    }catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    }
    //将str写到文件中
    try {
    Capture.fos.write(str.getBytes());
    Capture.fos.flush();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    }
    };//receiver初始化结束
    //开始抓包
    startCapture();
    }
    public static void main(String[] args) throws IOException {
    new Capture();
    }
    }




  • 相关阅读:
    洛谷 P1767 家族_NOI导刊2010普及(10)
    洛谷 P2919 [USACO08NOV]守护农场Guarding the Farm
    COGS 1619. [HEOI2012]采花
    UVA 11181 Probability|Given
    hdu 3336 Count the string
    洛谷 P2176 [USACO14FEB]路障Roadblock
    洛谷 P2691 逃离
    BZOJ 1040: [ZJOI2008]骑士
    vijos 1320 清点人数
    POJ 3417 Network
  • 原文地址:https://www.cnblogs.com/wenning/p/2389850.html
Copyright © 2020-2023  润新知