App逆向|实战protobuf加二代壳的app
先抓包分析,老样子上vpn,提示app不信任charles证书。
关闭ssl proxy 可以抓到,猜测应该是有额外的ssl pinning。上了几个脚本发现没用。那就只能看代码了。
jadx打开apk,发现加壳了
shell,明显的特征,爱加密!用dexdump先象征性的脱一下。
全是空的方法体,说明可能碰到了函数抽取型的壳了。要是没fart的话,我肯定会非常的沮丧,包也抓不到,壳也脱不掉,WDNMD!
还好认识了肉丝姐!直接掏出youpk和fart!
然后操作完出来的dex大小只有几十k都是些无关的类,肯定是不对的,看了作者说不支持App动态加载的dex/jar,怀疑这个app应该是用了动态加载的dex。
那就上寒冰巨佬的Fart!
链接:https://pan.baidu.com/s/1zAYliYbkagdUUsykww_L4g 提取码:vv5u
我下的sailfish_fart_8.1.0_r1 这个版本
刷好了就是这个样子的
操作也很简单,只要在手机上安装好apk,然后给app赋予读写权限然后打开app就开始脱壳了。
我们可以通过adb logcat 来查看日志
可能有好多个子进程所以提示了好多fart run over。(中途如果程序闪退,重新打开就好了)脱的壳会保存在
/sdcard/fart/ 这个文件夹下。可以通过查看他的大小是否不在增加来确定是否脱壳完毕。一般来说需要等个十几分钟左右。
如果没脱完壳就拿出来的话可能会导致有些方法体还是空的,这时候不要慌,可以使用frida-fart,针对一个类进行单独的dump
然后可以pull到电脑上,可以看到有三种文件:bin、txt、dex
带
excute
关键字的dex
文件是在excute
脱壳点脱下来的dex
文件,我们可以直接在jadx里面打开这个dex。关于该脱壳点的更多信息可以看《拨云见日:安卓APP脱壳的本质以及如何快速发现ART下的脱壳点》。带
excute
关键字的classlist_execute.txt
文件,该文件是dex
中所有类的类列表,类名是签名形式的以L
开头,表示它是一个类,$
后面是类中的方法。
修复命令:python fart.py -d xxx.dex -i xxx.bin >> repired.txt
(上面抄的肉丝姐文章 嘻嘻)
总结一下,并不是所有dex都需要修复的,有bin的才能修复,当你dump出来的方法体是空的时候,并且有bin文件,然后才要去修复,大部分不需要修复,直接在dex就有了。
让我们看看刚刚为空的方法体有没有dex里面了
啊这。。。因为没有bin文件,所有怀疑是没脱干净,试试frida-fart单独dump一个类!首先拷贝fart.so和fart64.so到/data/app目录下,并使用chmod 777 设置好权限,然后就可以使用了。同样要赋予app读写权限!
然后pull出来看看,在jadx里面打开看看
好起来了!Fart永远滴神!
其实先试试从框架层来看,先看看这个app用的是哪个框架,然后再去找他校验证书的地方,用objection 列出所有类 然后去日志里过滤查找,然后找找常用的框架,用hook去验证是否通过这里来定位。
这里推荐通过葫芦娃巨佬的ZenTrace来批量hook(可以一次性匹配几百几千个方法去hook,非常粗暴无脑,就是容易蹦)
这里选择了这个框架
然后查询数据 直接有东西出来了!然后app也崩了。但是没关系 我们想要的东西已经出来了,非常的牛逼各种参数都出来了。
定位到网络框架之后,就去objection 去hook 打调用栈
定位成功!这才是科学的办法!一顿乱搜属实弟弟。
一波带走,全出来了。
这里替换完发送请求后需要换回去,防止被app检测到。
拿下!配合脱壳后的代码就分析出这些加密了。这里的虚拟机的charles貌似不会自己解析protobuf? 我在真机上的会解析,对照着这个可以反解出proto。
有一位大佬曾经说过:你要破解某个功能,那你就必须会开发这个功能。 所有接下来就是学习protobuf开发环节,可以看谷歌官方文档。
也参考希望哥的博客:
https://blog.csdn.net/crazy__hope
还有Mocha-Lee大佬的文章
https://mp.weixin.qq.com/s/4nmukpACrNj1__J1ycVHIw
谢谢这两个大佬带我protobuf。但是这里面有个比较坑的点就是会出现下面这样的类型,我一开始以为是一对多,按理来说不可能出现这样的东西,一个字段要么是string,要么就是message,这两个一起出现了,我在这卡了三天。后来放弃了想用hook去做。
八秒解析一个请求。。。我等的花儿都谢了。算了 还是刚protobuf吧,后来求助了null大佬,帮我解析出来了,我看了下他填的是string类型,但是解析正常。他也有点疑惑。
后面我就想办法复现这个东西,然后发现这tm就是个string。。。只不过解析成这样了,哎,我枯了,浪费3天时间研究。
解析完就成了!上张结果图。
protobuf的字段对应要去反编译的代码里面找,然后有个小技巧就是可以hook解析成功后的结果来对应着找。
实战总结:
fart和fart-frida的配合使用。
基于框架层定位请求。
里面aes 和 baes64翻译成python有坑,对这两个加密的更理解深入了(感谢故里大佬指点)
protobuf反解的经验积累。
最后来一句肉丝姐牛逼!逆向不知肉丝姐,学遍安卓也枉然