信息安全技术—实验四:Ip包监视程序实现

一、实验目的及要求

学生在熟悉网络数据通信原理以及TCP/IP协议结构原理的基础上,运用套接字编程实现的网络封包监视技术,有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。要求:

  1.熟悉网络数据通信原理以及TCP/IP协议结构原理

2.掌握Ip包发送和接收过程。

3.在所学知识的基础上自己确定实验方案,画出流程图,独立编程,实现网络监听程序。

4.对获取的数据包进行简单分析。

二、实验内容

将网卡的工作模式设置为混合模式。获取局域网内的某台(多台)主机的MAC地址,捕获到所有经过网卡的数据包,并可从中分析出协议、IP源地址、IP目标地址、TCP源端口号、TCP目标端口号以及数据包长度等信息。

三、实验环境

运行windows的PC机,具有JAVA、VC(windows)等语言编译环境。

四、实验步骤及结果分析

好多人都会在winpcap和jpcap上面出现在问题,所以接下来就讲一下如何操作,这里用到的软件是eclipse,源代码放在了文章结尾处。

  1、搭配开发环境,首先下载winpcap和jpcap.

winpcap就是一个更加底层的系统, 通过这个软件可以在window平台下实现直接的网络编程;但是要注意的是winpcap的实现是使用C/C++实现的, 所以我们就需要一个中间件来实现从C到Java的转化;

jpcap简单来说就是对于winpcap一层封装 作为一个中间件,调用winpcap,提供一个接口,使Java实现对数据链路层的控制;这样现实了平台的无关性;

直接将winpcap下载好即可,jpcap中有两个文件,将jpcap.dll放在Java的bin目录下。

图1.1部署jpcap.dll

将jpcap.jar部署在eclipse中。具体操作是将jpcap.jar复制在创建文件的src下,然后右击jpcap.jar,Build Path—Add to Build Path.

 

图1.2jpcap的部署

        2、显示网络设备列表

    public static void main(String[] args) {

        /*--            第一步绑定网络设备           --*/

        NetworkInterface[] devices = JpcapCaptor.getDeviceList();

        int m = -1;

        for (NetworkInterface n : devices) {

         m ++;

            System.out.println("序号 " + m + " " +n.name + "   |   " + n.description);

        }

        System.out.println("---------------------------------------------------");

  2.1网卡分析

图2.1网卡分析

目前电脑没有连接以太网,所以没有以太网对应的网卡序号,序号7、8是使用无线wi-fi网络的网卡序号。

 3、打开网络接口

静态方法 static JpcapCaptor openDevice (NetworkInterface interface, int snaplen, boolean promisc, int to_ms):

创建一个与指定设备的连接并返回该连接。

/*--------第二步,选择网卡并打开网卡连接--------*/

        // 选择网卡序号;

        // 注意!每台设备连接网络的网卡不同,选择正确的网卡才能捕获到数据包;

        System.out.println("请输入你想要监听的网卡序号: ");

        Scanner sc = new Scanner(System.in);

        int index = sc.nextInt();

        

JpcapCaptor jpcap = null;// 声明一个JpcapCaptor全局实例变量 jpcap;

        // 打开网卡连接,此时还未开始捕获数据包;

        try {

            jpcap = JpcapCaptor.openDevice(devices[index], 1512, true,5000);// 捕获时间为5s

        } catch (IOException e) {

            e.printStackTrace();

            System.out.println("抓取数据包时出现异常!!");

        }

        4、抓包分析  

        /*--               第二步抓包               --*/
        int i = 0;
        while (i < 10) {
            Packet packet = jpcap.getPacket();
            if (packet instanceof IPPacket && ((IPPacket) packet).version==4) {
                i++;
                IPPacket ip = (IPPacket) packet;

                System.out.println("版本:IPv4");
                System.out.println("优先权:"+ip.priority);
                System.out.println("服务设置-是否为最大吞吐量:"+ip.t_flag);
                System.out.println("服务设置-是否有更低时延:"+ip.d_flag);
                System.out.println("服务设置-是否有最高的可靠性:"+ip.r_flag);
                System.out.println("长度:"+ip.length);
                System.out.println("标识:"+ip.ident);
                System.out.println("数据偏移设置-有无碎片标识:"+ip.rsv_frag);
                System.out.println("数据偏移设置-末尾碎片标识:"+ip.dont_frag);
                System.out.println("数据偏移设置-有碎片标识:"+ip.more_frag);
                System.out.println("分段偏移:"+ip.offset);
                System.out.println("生存时间(周期):"+ip.hop_limit);

                String protocol = "";
                switch (new Integer(ip.protocol)) {
                    case 1: protocol="ICMP"; break;
                    case 2: protocol="IGMP"; break;
                    case 6: protocol="TCP"; break;
                    case 8: protocol="EGP"; break;
                    case 9: protocol="IGP"; break;
                    case 17: protocol="UDP"; break;
                    case 41: protocol="IPv6"; break;
                    case 89: protocol="OSPF"; break;
                    default: protocol="Other"; break;
                }

                System.out.println("协议:"+protocol);
                System.out.println("源IP:"+ip.src_ip.getHostAddress());
                System.out.println("目的IP:"+ip.dst_ip.getHostAddress());
                System.out.println("源主机名:"+ip.src_ip);
                System.out.println("目的主机名:"+ip.dst_ip);
                System.out.println("----------------------------------");
            }
        }
}

        

图4.1抓包分析

源码:

package 信息安全;

import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;
import java.io.IOException;
import java.util.Scanner;

public class JpcapPacket {
    public static void main(String[] args) {
        /*--            第一步绑定网络设备           --*/
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
        int m = -1;
        for (NetworkInterface n : devices) {
        	m ++;
            System.out.println("序号 " + m + " " +n.name + "   |   " + n.description);
        }
        System.out.println("---------------------------------------------------");
  
		/*--------第二步,选择网卡并打开网卡连接--------*/
        // 选择网卡序号;
        // 注意!每台设备连接网络的网卡不同,选择正确的网卡才能捕获到数据包;
        System.out.println("请输入你想要监听的网卡序号: ");
        Scanner sc = new Scanner(System.in);
        int index = sc.nextInt();
        
		JpcapCaptor jpcap = null;// 声明一个JpcapCaptor全局实例变量 jpcap;
        // 打开网卡连接,此时还未开始捕获数据包;
        try {
            jpcap = JpcapCaptor.openDevice(devices[index], 1512, true,5000);// 捕获时间为5s
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("抓取数据包时出现异常!!");
        }


        /*--               第二步抓包               --*/
        int i = 0;
        while (i < 10) {
            Packet packet = jpcap.getPacket();
            if (packet instanceof IPPacket && ((IPPacket) packet).version==4) {
                i++;
                IPPacket ip = (IPPacket) packet;

                System.out.println("版本:IPv4");
                System.out.println("优先权:"+ip.priority);
                System.out.println("服务设置-是否为最大吞吐量:"+ip.t_flag);
                System.out.println("服务设置-是否有更低时延:"+ip.d_flag);
                System.out.println("服务设置-是否有最高的可靠性:"+ip.r_flag);
                System.out.println("长度:"+ip.length);
                System.out.println("标识:"+ip.ident);
                System.out.println("数据偏移设置-有无碎片标识:"+ip.rsv_frag);
                System.out.println("数据偏移设置-末尾碎片标识:"+ip.dont_frag);
                System.out.println("数据偏移设置-有碎片标识:"+ip.more_frag);
                System.out.println("分段偏移:"+ip.offset);
                System.out.println("生存时间(周期):"+ip.hop_limit);

                String protocol = "";
                switch (new Integer(ip.protocol)) {
                    case 1: protocol="ICMP"; break;
                    case 2: protocol="IGMP"; break;
                    case 6: protocol="TCP"; break;
                    case 8: protocol="EGP"; break;
                    case 9: protocol="IGP"; break;
                    case 17: protocol="UDP"; break;
                    case 41: protocol="IPv6"; break;
                    case 89: protocol="OSPF"; break;
                    default: protocol="Other"; break;
                }

                System.out.println("协议:"+protocol);
                System.out.println("源IP:"+ip.src_ip.getHostAddress());
                System.out.println("目的IP:"+ip.dst_ip.getHostAddress());
                System.out.println("源主机名:"+ip.src_ip);
                System.out.println("目的主机名:"+ip.dst_ip);
                System.out.println("----------------------------------");
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值