问题背景
最近在研究小程序相关的安全问题,需要对各端小程序进行抓包。微信能简单地使用burpsuite捕获,非常方便,但是支付宝却一个包都抓不到,因此在这里做一个记录。
尝试思路
首先当然是看看别人怎么做这个问题的。在网上找了一些帖子,解决方案分为两种:
- 应用并不连接系统代理,因此可以通过vpn软件(我尝试的是drony)强行让应用的流量走代理。
 这个方法对于一般的应用应该还是挺有效的,但是当我尝试抓支付宝的时候发现,虽然能看到一些包了,但是应用变得很卡,小程序也完全打不开,不知道是vpn的延迟太高被检测了还是支付宝有什么其他的安全措施。 - 支付宝使用mtop sdk进行网络通信,修改其中的一些配置令其降级就能抓包。
 hook mtopsdk.mtop.global.SwitchConfig.isGlobalSpdySwitchOpen函数,让它永远返回0。但是帖子是19年的,如今用不了了也只能说毫不意外吧。
既然现有的方法都派不上用场了,就只能自己看看支付宝的代码是怎么写的了。
逆向网络SDK
有一位前辈说过一个非常好的逆向思路:从头尾两个方向开始尝试。那么先hook一下socket看看调用栈,很快就能定位发包相关的逻辑:
返回值就是我们需要的response,因此hook这个地方就能解决抓包的问题。
编写Frida脚本
该函数可以调用同一个类下的getOriginRequest()方法获取发送的请求包,并且函数自己的返回值即为返回包。但是还有一点小小的问题:httpResponse的内容只能读取一次,我们自己读掉了应用就读不了了。尝试了各种方法都没能解决,最后只能采取最简单粗暴的方法:发送两次request,一次用来打印,另一次用来返回。反正tcp重传也是很正常的事情,应该没什么影响。
具体脚本参见:https://github.com/realvegechick/FridaRepository/tree/main/AlipayCapture
一点不足之处就是不能修改response的内容,估计需要重新生成一个response类,怪麻烦的。目前这个脚本已经能够实时显示往来的流量,并且保存在/data/local/tmp/pcap/raw.txt里面,满足了查看流量的需求。
参考资料
- socket抓包:http://missking.cc/2021/05/04/zhuabao/
- (过时的)支付宝mtop降级脚本:https://zhangslob.github.io/2019/11/27/%E6%8A%93%E5%8C%85%EF%BC%9A%E6%B7%98%E5%AE%9D%E3%80%81%E6%94%AF%E4%BB%98%E5%AE%9D/
- 使用vpn强制转发流量:https://www.cnblogs.com/lulianqi/p/11380794.html#%E8%AF%81%E4%B9%A6%E6%A0%A1%E9%AA%8C%E5%8E%9F%E7%90%86