1.前言
接到客户需求需要分析某海外语音社交App其房间数据和榜单数据,该app除了部分hook检测外,还有个protobuf挺有意思的,现将该项目的整个流程还原
需要的工具如下:
一个app:链接:https://pan.baidu.com/s/1vK_CQ4JmccgoqYbN97xH1Q 提取码:6666
hook工具:Frida、magisk、一部Android9.0的真机
博客所写的所有算法还原均已开源在GitHub,地址
https://github.com/YotaGit/AlgorithmRestore
2.Frida和Xposed检测
一开始肯定是抓包,如果包都抓不到那还搞个锤子,打开httpcanary 它让我们去安装JustTrustMe,好的那我们就给他装上
这里用的是magisk安装的LSposed模块(LSposed需要基于Riru模块),然后在此模块上安装JustTrustMe,然后我们再次抓包
结果就翻车了,然后我们就会考虑是否有SSL双向验证,果断打开ProxyDroid
结果是依旧抓不到包,这包都抓不到还爬个锤子的数据,于是我们果断选择放弃。放弃当然是不可能放弃的。不是还有伟大的Frida吗,我们开启来看一下直接hook Java的请求库,这里抓包用到的是肉丝大佬的r0capture
https://github.com/r0ysue/r0capture
结果还是翻车了,这里的意思就是app被囚禁起来了,然后作者提供了一个更为牛逼的持久化Frida的结果方案,将gadget.so注入到app的运行内存中,这样就可以完美的解决frida服务注入的问题
如果逆向手把手亲自尝试该过程可以参看下面这篇文章
https://fadeevab.com/frida-gadget-injection-on-android-no-root-2-methods/
这里的话我们用的是一个已经做好的magisk模块去解决该问题,就不自己去造轮子了(因为不会)
https://github.com/qiang/Riru-ModuleFridaGadget
走到这里那么我们肯定会好奇到底是哪里检测了Frida使得其无法持久化
jdax打开后搜索frida然后映入眼帘的就是这个东西,这里枚举了需要检测的是Xposed和Frida
2.抓包分析
好了,那么我们现在去看一下能不能抓包,开启JustTrustMe后仍然无法用HttpCanary抓包,既然JustTrustMe无效,我们先把Root特征和magisk给隐藏一下
2-1.隐藏root
用这个脚本把root特征隐藏一下
https://codeshare.frida.re/@dzonerzy/fridantiroot/
2-2.过sslpinning
https://codeshare.frida.re/@akabe1/frida-multiple-unpinning/
于是我们挂上fiddler后就可以享受丝滑般的抓包了
3.protobuf数据解析
抓包是抓到了,但是数据很头痛,请求体和响应体是乱码,但后我们仔细看看请求头会发现一个有意思的东西Content-Type: application/proto,这个东西表示的是服务器和客户端预定以protobuf的形式去传输数据
3-1.什么是protobuf
网上很多教程,其实总结起来就一句话,他们用来protobuf后你就看不到键值对中的key了只能看到value,也就是说对接数据时不管你发过来的key是啥,只要value对上了就行
这里我们用blackboxprotobuf去解决该问题,这样就不需要自己手动去构造对象了,这个库可以自动帮我们构建
我们现在先将fiddler的请求头复制下来,这里注意有ctrl+c和Ctrl+v的习惯会导致你这一步很难受,然后拿不到请求体,你应该要像下图那样去复制该请求头,用ctrl+c去复制会有毒。在hexView下,save selected Bytes,保存为二进制文件
然后就可以解析出该数据,这个数据解析出来后,就要靠自己去猜哪一个value对应的是页面上的哪些数据
数据抓取
把这一切都搞定后有几个简单的加密参数,自己跟踪一下就出来了,最后看一下效果,数据抓取起来非常的丝滑