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