vlambda博客
学习文章列表

App逆向|实战protobuf加二代壳的app

    先抓包分析,老样子上vpn,提示app不信任charles证书。

    关闭ssl proxy 可以抓到,猜测应该是有额外的ssl pinning。上了几个脚本发现没用。那就只能看代码了。

App逆向|实战protobuf加二代壳的app

    jadx打开apk,发现加壳了

App逆向|实战protobuf加二代壳的app

    shell,明显的特征,爱加密!用dexdump先象征性的脱一下。


App逆向|实战protobuf加二代壳的app

    全是空的方法体,说明可能碰到了函数抽取型的壳了。要是没fart的话,我肯定会非常的沮丧,包也抓不到,壳也脱不掉,WDNMD!

    还好认识了肉丝姐!直接掏出youpk和fart!

App逆向|实战protobuf加二代壳的app

App逆向|实战protobuf加二代壳的app


    然后操作完出来的dex大小只有几十k都是些无关的类,肯定是不对的,看了作者说不支持App动态加载的dex/jar,怀疑这个app应该是用了动态加载的dex。

    那就上寒冰巨佬的Fart!

  • 链接:https://pan.baidu.com/s/1zAYliYbkagdUUsykww_L4g 提取码:vv5u

    我下的sailfish_fart_8.1.0_r1 这个版本


    刷好了就是这个样子的

App逆向|实战protobuf加二代壳的app

    操作也很简单,只要在手机上安装好apk,然后给app赋予读写权限然后打开app就开始脱壳了。

App逆向|实战protobuf加二代壳的app

    我们可以通过adb logcat 来查看日志 

App逆向|实战protobuf加二代壳的app

    可能有好多个子进程所以提示了好多fart run over。(中途如果程序闪退,重新打开就好了)脱的壳会保存在 

/sdcard/fart/ 这个文件夹下。可以通过查看他的大小是否不在增加来确定是否脱壳完毕。一般来说需要等个十几分钟左右。

App逆向|实战protobuf加二代壳的app

    如果没脱完壳就拿出来的话可能会导致有些方法体还是空的,这时候不要慌,可以使用frida-fart,针对一个类进行单独的dump

App逆向|实战protobuf加二代壳的app

    然后可以pull到电脑上,可以看到有三种文件:bin、txt、dex

App逆向|实战protobuf加二代壳的app

    

  • 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里面了

App逆向|实战protobuf加二代壳的app

App逆向|实战protobuf加二代壳的app

    啊这。。。因为没有bin文件,所有怀疑是没脱干净,试试frida-fart单独dump一个类!首先拷贝fart.so和fart64.so到/data/app目录下,并使用chmod 777 设置好权限,然后就可以使用了。同样要赋予app读写权限!

App逆向|实战protobuf加二代壳的app

App逆向|实战protobuf加二代壳的app

    然后pull出来看看,在jadx里面打开看看

App逆向|实战protobuf加二代壳的app

    好起来了!Fart永远滴神!

    其实先试试从框架层来看,先看看这个app用的是哪个框架,然后再去找他校验证书的地方,用objection 列出所有类 然后去日志里过滤查找,然后找找常用的框架,用hook去验证是否通过这里来定位。

App逆向|实战protobuf加二代壳的app

    这里推荐通过葫芦娃巨佬的ZenTrace来批量hook(可以一次性匹配几百几千个方法去hook,非常粗暴无脑,就是容易蹦)

    这里选择了这个框架

App逆向|实战protobuf加二代壳的app

    然后查询数据 直接有东西出来了!然后app也崩了。但是没关系 我们想要的东西已经出来了,非常的牛逼各种参数都出来了。

App逆向|实战protobuf加二代壳的app

    定位到网络框架之后,就去objection 去hook 打调用栈

App逆向|实战protobuf加二代壳的app

    定位成功!这才是科学的办法!一顿乱搜属实弟弟。

    

App逆向|实战protobuf加二代壳的app

    一波带走,全出来了。

    

App逆向|实战protobuf加二代壳的app

    这里替换完发送请求后需要换回去,防止被app检测到。

App逆向|实战protobuf加二代壳的app

    拿下!配合脱壳后的代码就分析出这些加密了。这里的虚拟机的charles貌似不会自己解析protobuf? 我在真机上的会解析,对照着这个可以反解出proto。

App逆向|实战protobuf加二代壳的app

    有一位大佬曾经说过:你要破解某个功能,那你就必须会开发这个功能。    所有接下来就是学习protobuf开发环节,可以看谷歌官方文档。

    也参考希望哥的博客:

https://blog.csdn.net/crazy__hope

    还有Mocha-Lee大佬的文章 

https://mp.weixin.qq.com/s/4nmukpACrNj1__J1ycVHIw

    谢谢这两个大佬带我protobuf。但是这里面有个比较坑的点就是会出现下面这样的类型,我一开始以为是一对多,按理来说不可能出现这样的东西,一个字段要么是string,要么就是message,这两个一起出现了,我在这卡了三天。后来放弃了想用hook去做。

App逆向|实战protobuf加二代壳的app

App逆向|实战protobuf加二代壳的app

    八秒解析一个请求。。。我等的花儿都谢了。算了 还是刚protobuf吧,后来求助了null大佬,帮我解析出来了,我看了下他填的是string类型,但是解析正常。他也有点疑惑。

App逆向|实战protobuf加二代壳的app

    后面我就想办法复现这个东西,然后发现这tm就是个string。。。只不过解析成这样了,哎,我枯了,浪费3天时间研究。

App逆向|实战protobuf加二代壳的app

    解析完就成了!上张结果图。

   protobuf的字段对应要去反编译的代码里面找,然后有个小技巧就是可以hook解析成功后的结果来对应着找。

    实战总结:

  1. fart和fart-frida的配合使用。     

  2. 基于框架层定位请求。

  3. 里面aes 和 baes64翻译成python有坑,对这两个加密的更理解深入了(感谢故里大佬指点)

  4. protobuf反解的经验积累。


    最后来一句肉丝姐牛逼!逆向不知肉丝姐,学遍安卓也枉然