Jpcap過濾GTunnel程序數據包


程序實現的目標

    這次的目標要拿到純的GTunnel數據包。

GTunnel簡要介紹

      GTunnel是一款代理軟件,該軟件有4種模式——“標准模式”、“Skype模式”、“GTalk模式”和“Tor模式”。標准模式和普通的代理軟件有點類似,需要搜索到可用的代理服務器然后就可以上代理了;Skype模式需要本機安裝了Skype,在啟動Skype通信軟件的前提下進行代理,實際上它是在Skype基礎上進行開發的,采用Skype的通信協議,並將Skype服務器作為代理服務器,這里客戶端邏輯就顯得很重要;GTalk模式跟Skype模式有點類似,顯然它是Google的一套東西,在該模式下你需要指定一個合法的Google賬戶,利用該賬戶來進行通信,其實這里的代理服務器顯然也是GTalk的服務器;Tor模式沒有研究過,對它感興趣的可以參考博文《常用XX軟件介紹》,里面有很詳細的介紹。

實現思路

      這里我還用到了一個程序gt.exe,這款軟件可以用來監聽本機發出的通信數據包,它是一款控制台的程序,運行起來后它會打印六元組信息:(時間,源IP,目的IP,源端口,目的端口,通信程序信息)。事實上通信程序信息包含的信息很豐富,包含有本程序的程序名、采用的傳輸層協議還有一些剩余的信息。顯然我需要從中得到的就是程序名和目的IP而已。根據從gt.exe獲取到的信息我可以拿到所有GTunnel.exe發向的目標IP地址,根據這些IP地址我可以從pcap文件中拿到純的GTunnel的數據包,即ip.dst或ip.src能匹配這些IP地址的數據包。實現思路還是相當清晰的,之后完全就是編碼的工作了。

編程環境

      但這次我不是用C/C++來實現的,用的Java編程語言,因為寫Java確實要比寫C/C++代碼要容易,而且現成的API提供使得實現更加容易。在編碼之前需要環境的支持,Winpcap是一定要裝的,Windows下所有抓包軟件(如Ethereal、Winshark)都需要winpcap的支持,還需要有Java的環境,裝完Jdk后你還需要安裝Jpcap。下載地址我就不提供了,直接Google一下jpcap就可以搜索到官網地址,根據鏈接地址可以猜測Jpcap應該是UCI大學搞出來的,雖然API很簡單,但是能有這種奉獻精神還是相當敬佩的。學習Jpcap的使用也相當容易,官網有提供相應的文檔,Tutorial是Jpcap的入門手冊,看完這個基本上就會用了,同時你也可以參考官網提供的一些Samples,結合Tutorial你能很快拿下Jpcap。再看看API文檔你會發現Jpcap真的很容易,結構很簡單。我下載的是0.7最新的版本,下載.exe程序后直接安裝就可以了。實際上它安裝的東西就是一個jpcap.dll文件和一個jpcap.jar,只不過需要安裝到系統環境下,就不需要你自己配置新的環境變量了。

附上代碼

 

Handler.java
 1 import java.io.BufferedReader;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileReader;
 4 import java.io.IOException;
 5 import java.util.ArrayList;
 6 import jpcap.JpcapCaptor;
 7 import jpcap.JpcapWriter;
 8 import jpcap.packet.IPPacket;
 9 import jpcap.packet.Packet;
10 
11 public class Handler {
12 
13     static JpcapCaptor captor;
14     static JpcapWriter writer;
15     
16     static final String KEYWORD = "GTunnel.exe"; // 查找關鍵字
17     
18     static final String OUTPUT_PCAP_FILE_NAME = "fresh.pcap"; // 保存GTunnel純數據流的文件名
19     
20     public static void main(String[] args) {
21     
22         if(args.length < 2) {
23             System.out.println("Invalid argument Error: java Handler [gtfilename] [pcapfilename] ([outputpcapfilename])");
24             return;
25         }
26         
27         // 解析gt.exe生成的文件,得到GTunnel相關行信息,主要是獲得目標主機的IP地址作為匹配地址
28         BufferedReader br = null;
29         try {
30             br = new BufferedReader(new FileReader(args[0]));
31         } catch (FileNotFoundException e1) {
32             // TODO Auto-generated catch block
33             e1.printStackTrace();
34         }
35         
36         String line = null;
37         ArrayList<String> list = new ArrayList<String>();
38 
39         try {
40             while ((line = br.readLine()) != null) {
41                 if (line.contains(KEYWORD)) { // 匹配含有GTunnel.exe關鍵字
42                     String remoteIP = line.split(",")[1].trim();
43                     if (!list.contains(remoteIP))
44                         list.add(remoteIP);
45                 }
46             }
47         } catch (IOException e) {
48             e.printStackTrace();
49         } finally {
50             try {
51                 if (br != null) {
52                     br.close();
53                     br = null;
54                 }
55             } catch (IOException e) {
56                 e.printStackTrace();
57             }
58         }
59 
60         // 解析pcap文件
61         try {
62             captor = JpcapCaptor.openFile(args[1]);
63             writer = JpcapWriter.openDumpFile(captor, args.length >= 3 ? args[2] : OUTPUT_PCAP_FILE_NAME);
64         } catch (IOException e) {
65             // TODO Auto-generated catch block
66             e.printStackTrace();
67         }
68         while (true) {
69             // read a packet from the opened file
70             Packet packet = captor.getPacket();
71             // if some error occurred or EOF has reached, break the loop
72             if (packet == null || packet == Packet.EOF)
73                 break;
74             // otherwise
75             if(packet instanceof IPPacket) {
76                 IPPacket ipPacket = (IPPacket) packet;
77                 // 從pcap文件中解析出所有與匹配地址一致的源/目的地址所對應的數據流
78                 if(list.contains(ipPacket.src_ip.getHostAddress()) || list.contains(ipPacket.dst_ip.getHostAddress())) {
79                     // 將數據流存入文件
80                     writer.writePacket(packet);
81                 }
82             }
83         }
84         
85         writer.close();
86         captor.close();
87 
88     }
89 
90 }

 

代碼說明

 

本程序是用java編寫,需搭建java環境,由於調用了jpcap包相關API,需搭建jpcap環境,安裝JpcapSetup程序即可。

 

使用本程序方法:
1.若已經編譯生成class文件則直接跳到下一個步驟,否則先使用javac命令進行編譯,完整命令為javac Handler.java。

 

2.在cmd下輸入 java Handler [gtfilename] [pcapfilename] ([outputpcapfilename])
即指定兩個或三個參數:第一個參數為gt.exe生成的文件名;第二個參數是WinPcap捕獲得到的dump文件;第三個參數是生成純數據流的dump文件名,可不指定,默認為fresh.pcap。

 

注:
本程序在jre6.0環境下運行時會報一個嚴重的錯誤,這個錯誤具體原因還沒得到解決,可能跟jre自身有關系。

 

#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x76fc2a01, pid=8944, tid=8936
#
# JRE version: 6.0_20-b02
# Java VM: Java HotSpot(TM) Client VM (16.3-b01 mixed mode, sharing windows-x86
)
# Problematic frame:
# C [ntdll.dll+0x52a01]
#
# An error report file with more information is saved as:
# C:\Users\kelvin\Desktop\hs_err_pid8944.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM