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