一直都有一个想法去写一个app来控制哪些app可以访问网络,并且像tcpdump一样监测网络包发了什么东西好调试自己写好的网络应用。
最开始一直都想着围绕Google的ToyVxN的例子去得到packet的IO instance,这样就可以dump出来packet的具体内容了;也就是说使用Android VxN的接口,在本地开一个假的VxN,得到所有网络连接,这样就可以做到tcpdump的功能,再逐个对连接调用protect()
放行;但是琢磨了半天,没有找到一个比较好的方法去relay网络流,原封不动的把流量从Android本地再发出去。自己写我的兴趣又不太在这上面。
https://android.googlesource.com/platform/development/+/master/samples
于是今天再次尝试搜索,终于找到了
它介绍了如何具体relay网络流,里面使用了另一个人写的东西
虽然是2019年的了,git clone
下来gradlew build
一下,还是可以用的,sdk到28也不老;而且明显可以改到最新的31。ToyShark从名字看就知道是致敬网络抓包WinShark工具。这样运行ToyShark以后,会启动一个假的VxN,实则得到所有IP流量的packet,然后以列表的方式打印出来。
这些显示在UI上的代码都在 com/lipisoft/toyshark/PacketListAdapter.java
里。其实不难发现,只要把这些信息和packet里的内容都dump到一个文件里写成.cap
,就算完成tcpdump的功能了。
至于对每个app进行网络访问控制,可以通过接口函数进行allow和reject,这样就加强了Android的安全管理,就是说虽然现在Android已经有了对某个app进行网络权限的设置,但是有时候我们并不知道哪个app在背后访问网络。有了这个工具,流量就基本跑不掉了。基于这个原理,后面的工具就是加一个界面,列出所有app,然后匹配packet了。
好了,可以安心调试app的网络api request了。