功能设计:
在设计之初,本设计被期望实现下面功能:
①有一个对用户友好的操作界面,使用户对软件上手快和操作简单;
②能对网卡进行选择,选择用户自己需要进行监听抓包的网卡;
③能够侦听所有进出本主机的数据包,完整显示数据包网络层和传输层的头信息。比如,对IP头而言,需要显示版本、头长度、服务类型、数据包长度、标识、DF/MF标志、段内偏移、生存期、协议类型、源目的IP地址、选项内容,并且要求显示数据的实际含义;
④能够设置过滤规则,比如说侦听来源于指定IP地址的数据;
⑤显示接受到的TCP数据包的全部实际内容,并且要考虑一个TCP包划分为多个IP包传输的情况;
⑥功能验证手段,比如说,在运行网络嗅探器的同时,执行标准的Ping、Telnet和浏览网页等操作,检查网络嗅探器能否返回预期的结果。
具体实现:
1.选择网卡进行抓包:
(1)通过JpcapCaptor类的getDevices()函数获取主机的网卡信息:
public static NetworkInterface[] getDevices() {
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
return devices;
}
(2)将每个网卡添加到“网卡”菜单的菜单项中:
menuFile1 = new JMenu(" 网卡 ");
NetworkInterface[] devices = new NetworkCard().getDevices();
item = new JMenuItem[devices.length];
for (int i = 0; i < devices.length; i++) {
item[i] = new JMenuItem(i + ": " + devices[i].name + "("
+ devices[i].description + ")");
menuFile1.add(item[i]);
(3)对每个菜单项添加指定的动作侦听器,进行监听,当用户点击此处时将该网卡设为抓包网卡,并打开线程,使用JpcapCaptor.openDevice()打开网络接口,用captor.getPacket()进行抓包:
①添加动作侦听器:
item[i].addActionListener(
new CardActionListener(devices[i]));
②动作响应:
public void actionPerformed(ActionEvent e) {
allpackets.setDevice(device);
allpackets.setFilter("");
Thread myThread = new Thread(allpackets);
myThread.start(); //开启抓包线程
}
③开始抓包:
Packet packet;
try {
JpcapCaptor captor = JpcapCaptor.openDevice(device, 65535,true, 20);
//System.out.println(device.name);
while(!this.flag){
long startTime = System.currentTimeMillis();
while (startTime + 600 >= System.currentTimeMillis()) {
//captor.setFilter(FilterMess, true);
packet = captor.getPacket();
2.对捕获包进行分析
(1)分析:通过调用jpcap库中相应API对捕获的包进行分析,如:IPanalyze()、ICMPanalyze()等,并将分析的结果按一定格式进行封装。
(2)简要信息显示:将捕获的包添加到packetlist中,通过showTable()按一定格式显示出来。
public static void showTable(Packet packet){
String[] rowData = getObj(packet);
tablemodel.addRow(rowData);
}
(3)详细信息显示:该包分析的结果按一定格式显示出来,如:分为IP头部分、上层协议部分等。
(4)保存至本地:添加动作侦听器,监听“保存到本地”按钮。当用户点击此处时,调用FileOutputStream的API将文件保存至D盘。
save.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e3) {
String text = info.getText();
int name = (int)System.currentTimeMillis();
try {
FileOutputStream fos = new FileOutputStream("d://"+name+".txt");
fos.write(text.getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
3.统计数量与暂停抓包
(1)数量统计:对包进行过滤时,每次有一个包符合过滤规则,就让count+1,然后用text.setText(String.valueOf(allpackets.count))把它显示到相应的按钮上。
count = 0;
packetlist.clear();
for(Packet p : bak) {
if(TestFilter(p)) {
packetlist.add(p);
showTable(p);
count++;
}
if(packet!=null&&TestFilter(packet)){
count++;
// System.out.println(packet);
packetlist.add(packet);
bak.add(packet);
showTable(packet);
}
(2)暂停抓包:设置一个动作侦听器,当动作发生时,将标记值flag的值设置为true,使得抓包的循环结束,从而起到暂停抓包的作用。
endButton = new JButton("结束");
endButton.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
allpackets.setFlag(true);
}
}
);
4.对捕获的包进行过滤
(1)设置相应的过滤按钮,如协议(tcp、udp、icmp)、源IP、目的ip等,并设置相应的动作侦听器。
sipButton = new JButton(" 源IP ");
sipButton.addActionListener(
new ActionListener(){
(2)当动作发生时,将过滤的值设置到PacketCapture类的allpackets对象相应的值上,并清除当前显示的值。
public void actionPerformed(ActionEvent e) {
String fsip = JOptionPane.showInputDialog("请输入源IP,以筛选数据包:");
allpackets.setFilter("sip "+fsip);
while(tableModel.getRowCount()>0){
tableModel.removeRow(tableModel.getRowCount()-1);
}
allpackets.clearpackets();
}
(3)由于抓包时有进行备份,所以清除packetlist的数据时并不会导致原有的数据丢失;接着将备份列表bak与过滤则进行对比,如果符合规则,则将其添加到packetlist,并将其显示出来。
public void clearpackets(){
count = 0;
packetlist.clear();
for(Packet p : bak) {
if(TestFilter(p)) {
packetlist.add(p);
showTable(p);
count++;
}
}
}
(4)过滤规则:通过设置的过滤值,让过滤值与packet(捕获的包)相应的值进行对比,如果相等,则符合规则。
public static boolean TestFilter(Packet packet){
if(FilterMess.contains("sip")){
String sip = FilterMess.substring(4, FilterMess.length());
if(new PacketAnalyze(packet).packetClass().get("源IP").equals(sip)){
return true;
}
}else if(FilterMess.contains("dip")){
String dip = FilterMess.substring(4, FilterMess.length());
if(new PacketAnalyze(packet).packetClass().get("目的IP").equals(dip)){
return true;
}
}else if(FilterMess.contains("ICMP")){
if(new PacketAnalyze(packet).packetClass().get("协议").equals("ICMP")){
return true;
}
}
else if(FilterMess.contains("UDP")){
if(new PacketAnalyze(packet).packetClass().get("协议").equals("UDP")){
return true;
}
}else if(FilterMess.contains("TCP")){
if(new PacketAnalyze(packet).packetClass().get("协议").equals("TCP")){
return true;
}
}else if(FilterMess.contains("keyword")){
String keyword = FilterMess.substring(8, FilterMess.length());
if(new PacketAnalyze(packet).packetClass().get("数据").contains(keyword)){
return true;
}
}else if(FilterMess.equals("")){
return true;
}
return false;
}
具体代码:https://download.csdn.net/download/weixin_40789841/12116012