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.
#

 

你可能感兴趣的:(CAP)