利用梆梆加固逻辑漏洞取巧脱壳
首先要道个歉,之前要发的进程注入,开发hook框架、插件化等技术,因为原公司产品还在使用,暂时是不能开源了,还是食言了。
抽空看了几家加固的应用,做了个通用脱壳机(轻量化,只需要进程注入埋点,全Java层即可,可以不依赖hook框架,当然我为了方便使用的我自己写的hook框架。类似dexhunter以及一些修改源码、编译系统的方式太重了),暂时除了梆梆函数级加密,其他加固的抽取字节码的只要还还原,就可以脱,例如爱加密,也发现了一些加固的逻辑漏洞,可以取巧脱壳(此处脱壳定义,仅限恢复非被置为Native的方法,java2c、vmp、java2jni的不在恢复范围),今天抛砖引玉,发一个梆梆的取巧脱壳的方法。
梆梆免费版的逆向分析就不来了,几位大佬都有过分析。
加固后,原dex被打包到secData0.jar中,secData0.jar是加密过的zip文件(不是zip加密)
加固应用沙箱文件
.cache内有加密过的jar和dex(其实是同样的加密算法)
应用第一次运行把secData0.jar复制到.cache内,即classes.jar,解密后解压出dex,在内存中拼组odex结构,写回沙箱的是个加密的odex。
解密classes.dex
仅需在应用进程执行如下代码,读取再写回即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
qq即为解密后的odex
使用jeb等工具打开即可
原理
通过注入进程,埋点、挂钩,在应用进程执行代码,梆梆hook了io相关的函数,所以读取classes.dex的时候已经被梆梆解密并重定向读取解密后的dex,所以只需读取并写到一个文件中即可。
注入进程并不一定非要注入当前应用进程,父进程埋点即可。
其实hook的定义个人觉得很多人都会以为像xposed这样基于方法的才是hook,其实安卓中的binder,Java的动态代理,(反射)替换对象等都可以理解为hook,上面的父进程和应用进程埋点,完全可以不用任何hook框架即可实现。
以上就是利用壳本身的机制,取巧脱壳的一种方式。防御就不提了,梆梆免费版在同类加固中算是很弱的了,应该也是不想在免费版上加强了。以上方式也可用于企业版,只是函数级加密被抽取的字节码并不能通过这种方式获取到。