功能設計:
在設計之初,本設計被期望實現下面功能:
①有一個對用戶友好的操作界面,使用戶對軟件上手快和操作簡單;
②能對網卡進行選擇,選擇用戶自己需要進行監聽抓包的網卡;
③能夠偵聽所有進出本主機的數據包,完整顯示數據包網絡層和傳輸層的頭信息。比如,對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