gpt4 book ai didi

android - 在 Android 中捕获网络数据包?

转载 作者:IT老高 更新时间:2023-10-28 23:36:10 26 4
gpt4 key购买 nike

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

Android 为此目的提供了 VpnService,已在 API 级别 14 中添加。尽管在 SO 上似乎有很多关于此的问题,但令人惊讶的是,它的工作示例非常少。我尝试使用示例中添加的 ToyVpn,但无法使其工作。然后我想到了这个例子。

VpnService Example

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

  1. 创建一个 TUN 接口(interface)(我仍然不确定 TUN 是什么,但在网上冲浪说它是在设备上模拟网络层)。
  2. 通过 TUN 获取传入数据包和传出数据包的文件描述符。
  3. 将这些数据包转发到实际服务器。 (不确定这里是什么服务器?每个传出的数据包都有一个requestUrl,那么这里的服务器是指将请求委托(delegate)给requestUrl服务器。或者服务器是指创建你自己的server 在 AWS 上的某处,并将所有流量重定向到那里,这反过来又会将流量重定向到实际目的地)。
  4. 从服务器获取响应。
  5. 在 TUN 的帮助下,再次将此响应传递给应用程序的预期组件。

我使用以下代码创建了一个 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库,但似乎要捕获实时数据包,手机需要root,这不是我的应用程序的要求。

最佳答案

可以肯定的是,您最好的选择是设置代理服务器,然后使用诸如 wireshark 之类的东西来监控进出的流量。我不是这方面的专家,但在过去,在交换路由器如此便宜之前,这很容易,因为所有数据包都广播到同一子网上的所有计算机。也许如果您可以使用能够禁用切换的集线器/路由器,您可以使用此方法而不是代理。

如今,大多数通信都是使用 http 完成的,为此您拥有出色的工具,例如 Charles (mac)Fiddler (windows)除了http之外,它完全符合您的要求。他们至少可以为您提供有关如何使用 Wireshark 做同样事情的想法。

关于android - 在 Android 中捕获网络数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35536853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com