用例是:
- Android 手机上的所有应用程序都将通过 wifi 连接到互联网。
- 我想要一个应用程序来窃听来自所有应用程序的 http 流量,以便我可以找到他们访问的网站。
- 此应用程序将作为 apk 分发,用户将在他们的手机上安装此应用程序。
我如何实现这一点?
我会说说我的尝试:
- 使用自定义 Vpn 服务应用程序,其中的 Activity 会触发从 VpnService 派生的服务。
- Custom VpnService 调用构建器并设置 Mtu、addRoute、addAddress,然后添加 DnsServer。
- 然后服务从与生成器的 establish() 调用生成的接口(interface)关联的文件描述符中读取。
现在,如果使用 ("0.0.0.0", 0) 调用 addRoute,我就能拦截流量并查看数据包内容。但是如果不创建 udp 隧道到我不想做的外部服务器,我就无法路由数据包。
如果使用 Wifi 路由器 IP 调用 addRoute,则所有生成的数据包都会自动进行路由。但是我无法拦截与虚拟接口(interface)关联的文件描述符上的数据包。它根本不会在 read() 调用中收到任何数据。
我想做的是:
- 拦截流量以检查 http header
- 与此同时,像普通 wifi 连接一样照常进行路由。
- 让手机里的一切都自成一体。不应有外部服务器。
- 此应用程序不需要任何生根等。它应该像普通应用程序一样安装。
最佳答案
我建议1) 设置代理 和2) 运行一个充当代理的应用。这两者的组合不需要 root 权限。
设置代理
第一点可能是最棘手的一点。设置软件级代理(无需 root)的唯一方法是导航至 Wi-Fi 连接设置并手动设置代理。然而,有一个开源应用程序最终可以绕过这个特定步骤:ProxySettings .
拦截流量
在我看来,最好的选择是使用 SandroProxy,它是一款适用于 Android 的开源代理应用程序。它写得非常好,目前正在维护和支持,并且允许您拦截 HTTP 流量甚至修改它。可以找到代码here , 而示例应用程序可以在 here 中找到.
此解决方案应满足您的所有要求:
- 拦截流量(甚至编辑它):由于代理设置,所有网络流量都通过与您的应用程序相对应的代理地址
- 编辑是可选的:一切都会继续工作,因为没有设置代理
- 一切都在本地:不需要外部服务器,您的代理就是已安装的应用程序
- 无需根
关于android - 如何在 android 上做一个 http 窃听器或代理应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28365314/