首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Android中捕获网络数据包?

在Android中捕获网络数据包?
EN

Stack Overflow用户
提问于 2016-02-21 21:39:45
回答 1查看 2.7K关注 0票数 17

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

安卓为此提供了VpnService,这是在API14级中添加的。虽然在这方面似乎有很多问题,但令人惊讶的是,关于它的工作示例非常少。我尝试使用示例中添加的ToyVpn,但我无法使其工作。然后我想到了这个例子。

VpnService Example

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

  1. 创建TUN接口(我仍然不确定TUN是什么,但网上冲浪说它是设备上网络层的仿真)。
  2. 通过TUN获取传入数据包和传出数据包的文件描述符。
  3. 将这些数据包转发到实际的服务器。(不确定这里的服务器是什么?每个传出的数据包都有一个requestUrl,所以服务器也是如此,这里的意思是将请求委托给requestUrl服务器。或者服务器是否意味着在亚马逊网络服务上的某处创建您自己的服务器,并将那里的所有流量重定向到实际目的地)。
  4. 从服务器获取响应。
  5. 借助TUN,再次将此响应传递到Application.

的目标组件

我用下面的代码创建了一个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���

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

但是在这之后我应该做什么呢?如何将数据转发到服务器?我相信有更少的工作例子。但是有没有人可以给我一步一步的程序来实现这个目标呢?

更新:经过进一步的挖掘,我知道我需要创建一个服务器,并将截获的数据包转发到服务器。我在我的计算机上创建了一个服务器,并且能够成功地将截获的数据包转发到我的服务器。但我不确定如何从接收到的数据包中获取实际的目的ip和端口,以便将它们发送到预期的目的地。

PS:我还查看了JnetPcap库,但似乎要捕获实时数据包,手机需要启动,而这不是我的应用程序的要求。

EN

回答 1

Stack Overflow用户

发布于 2016-02-26 19:25:13

我敢肯定,您最好的办法是设置一个代理服务器,然后使用wireshark之类的工具来监控进出的流量。我不是这方面的专家,但在交换路由器如此便宜的旧时代,这是非常容易的,因为所有的数据包都广播到同一子网中的所有计算机。也许,如果你能得到一个能够禁用交换的集线器/路由器,你就可以使用这种方法而不是代理。

如今,大多数通信都是使用http完成的,为此,您有优秀的工具,如Charles (mac)Fiddler (windows),除了http之外,它们完全可以做您想做的事情。他们至少可以告诉你如何用Wireshark做同样的事情

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35536853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档