在Android中捕获networking包?

我正在一个项目中,我需要捕获传入/传出的数据包,并将它们存储在pcap文件中。

Android已经为此目的提供了VpnService ,并在API Level 14中添加了这个function。尽pipe似乎有很多关于这个的问题,但是令人惊讶的是,它的工作范例非常less。 我尝试使用在示例中添加的ToyVpn,但我无法使其工作。 那么我来看这个例子。

VpnService示例

该示例总结了以下步骤中的捕获。

  1. 创build一个TUN界面(我还不确定TUN是什么,但在网上冲浪说它是仿真设备上的networking层)。
  2. 通过TUN获取传入数据包和传出数据包的文件描述符。
  3. 将这些数据包转发给实际的服务器。 (不知道这里是什么服务器?每个传出的数据包都有一个requestUrl ,那么服务器在这里意味着将请求委托给requestUrl服务器 ,或者服务器是指在AWS上创build自己的服务器 ,并将所有的stream量redirect到那里将stream量redirect到实际的目的地)。
  4. 从服务器获取响应。
  5. 在TUN的帮助下,再次将此响应传递给应用程序的预期组件。

我使用下面的代码创build了一个TUN。 我给了上述教程给出的地址。 不确定,如果有正确的值。 以及如何决定这个地址。

  Builder builder = new Builder(); ParcelFileDescriptor mInterface = builder.setSession("MyVPNService") .addAddress("192.168.0.1", 24) .addDnsServer("8.8.8.8") .addRoute("0.0.0.0", 0).establish(); 

接下来我得到了文件描述符,并打开了隧道。

  FileInputStream in = new FileInputStream( mInterface.getFileDescriptor()); DatagramChannel tunnel = DatagramChannel.open(); // I have created a EC2 instance on AWS, and gave the ip Address and port of that server. Not sure if this is the correct method. tunnel.connect(new InetSocketAddress("54.254.187.207", 5000)); //d. Protect this socket, so package send by it will not be feedback to the vpn service. protect(tunnel.socket()); 

然后应用一个while循环来读取数据包。

  while (true) { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); while(true){ String line = reader.readLine(); if(line ==null){ break; }else{ System.out.println("line is "+line); } // I am guessing that here after reading the packets, I need to forward them to the actual server. }} 

这给了我以下的输出

 02-21 19:12:26.074 16435-16778/awesomedroidapps.com.debugger I/System.out: line is E    @ '@  @      <  5  ,                    graphfacebookcom      E    @ (@   02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is E    @0@  @    d : N    P V x %0/ W      02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   EP    02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is  %0. %0/E    L @  @     Ɂ  5  8 [                 apploadingestcrittercismcom      E    @ :@  @     d6    > Wz  y A x [     02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   T@  02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is y 1 y 7E    A @  @        5  -  -                 decidemixpanelcom      E      ;@  @ F   d6    > Wz y A x       02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   ]@   F    BA  +  q ϔ   Jb2_' D y ̯  [: 1)   PΠ ѡ   h71 L 3 =~      (                 S ~'U      9d_   " I E    @0@  @  02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is    d : N    P V x %0/ W       02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   ^P    02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is  %0. %0/E    = @  @         5  )l                t appsflyercom      E    = @  @      6  5  ) .                t appsflyercom      E    @0@  @    d : N    P V x %0/ W       02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is    P     02-21 19:12:26.074 16435-16778/awesomedroidapps.com.debugger I/System.out: line is E    @ '@  @      <  5  ,                    graphfacebookcom      E    @ (@   02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is E    @0@  @    d : N    P V x %0/ W      02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   EP    02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is  %0. %0/E    L @  @     Ɂ  5  8 [                 apploadingestcrittercismcom      E    @ :@  @     d6    > Wz  y A x [     02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   T@  02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is y 1 y 7E    A @  @        5  -  -                 decidemixpanelcom      E      ;@  @ F   d6    > Wz y A x       02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   ]@   F    BA  +  q ϔ   Jb2_' D y ̯  [: 1)   PΠ ѡ   h71 L 3 =~      (                 S ~'U      9d_   " I E    @0@  @  02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is    d : N    P V x %0/ W       02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   ^P    02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is  %0. %0/E    = @  @         5  )l                t appsflyercom      E    = @  @      6  5  ) .                t appsflyercom      E    @0@  @    d : N    P V x %0/ W       02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is    P    

从日志中可以清楚地看到,我能够捕获TUN中的传出数据包。 上面的日志某处是像facebook.com这样的打印主机,这让我相信我处于正确的轨道上。

但是接下来我应该怎么做呢? 如何将数据转发到服务器? 我相信有一些工作的例子。 但有人可以一步一步地给我如何实现这个东西?

更新 :进一步挖掘,我才知道,我需要创build一个服务器,并将截获的数据包转发到服务器。 我在我的电脑上创build了一个服务器,并能够成功地将拦截的数据包转发到我的服务器。 但我不知道如何从收到的数据包中获取实际的目标IP和端口,以便我可以将它们发送到预定的目的地。

PS :我也经过了JnetPcap库,但是看起来要捕获实时数据包,电话需要扎根,这不是我的应用程序的要求。

Solutions Collecting From Web of "在Android中捕获networking包?"

相当肯定你最好的select是设置一个代理服务器,然后使用wireshark来监视来往的stream量。 我不是这方面的专家,但是在交换路由器之前的那些年代这么便宜,这很容易,因为所有的数据包都被广播到同一子网中的所有计算机上。 也许如果你可以在一个能够禁止切换的集线器/路由器上使用,你可以使用这个方法而不是代理。

现在大多数通讯都是使用http完成的,因为你有像Charles(mac)和Fiddler(windows)这样的优秀工具,这些工具正是你想要的,除了http。 他们至less可以给你关于如何用Wireshark做同样的事情的想法