1. 背景说明
碰到某无法通过设置代理直接抓Http包的App,想探其原理
2. 发现异常
-
首先按照最普通的方法设置代理到PC机的 Charles、Brupsuit等软件,可以发现,App居然在访问localhost域名:
-
观察代码,发现App在本地使用了NanoHTTPD服务,由于手机设置了代理,向localhost的请求直接转移到了PC的localhost上,PC的localhost肯定连不上手机App开启的http服务,自然抓不到包:
-
端口号绑定在 10240+ 附近:
3. 解决方案
-
定位端口,用 ps 确定进程号,再用 netstat 确定端口号,结合抓包结果,那几个10240+ 并且还在Listening的端口号就很可疑了:
-
这种情况,首先可以用手机自带浏览器试试,当然我们已经知道结果了,直接adb forward 把 pc机端口转发到手机上
-
请求成功:
3. 第二个坑
-
上一步只是解决了本地通信的问题,然而和远程服务端通信的问题仍然未解决。通过wireshark确实可以看到App存在和外网服务器的通信,猜测App未使用常规的Http通信。继续查看代码发现App自行构造的Http头:
-
这样就说的通了,由于App使用Socket 直接进行连接,未使用Http有关的Api,通过Wifi 的高级选项设置的代理自然不会起作用,这种情况的解决方案是给App设置全局代理,以Postern为例,规则2的ip和port设置为抓包工具的监听地址和端口:
-
可以成功抓包:
-
这里的数据包是经过加密后的,看一下数据包内容,符合App的加解密规则,: