脱壳练习(2)-最新免费版梆梆加固脱壳笔记
直接开始吧,末尾有附件。
1. java层分析
常规操作添加了一个application的入口,并加载了壳so libSecShell.so.
当dex加载完后通过这两个函数进行真正的application替换。
大概看一下其他文件。
DexInstall
大概是根据不同的sdk,进行dex的加载;
Dex的一般加载流程为:
Java层:替换classLoader –> 初始化DexPathList –> makeDexElements -> loadDexFile-> DexFile.loadDex -> DexFile(构造函数) –>openDexFile(进入native层,返回值为一个dex的cookie);
Native 层 :一般分文件加载和内存加载,常在内存加载的地方进行dump,dvm下常用dvmRawDexFileOpenArray,dvmDexFileOpenPartial,libart下常用openMemory。
查看一下其他文件:
SecData0.jar猜测为dex经过加密后存储的地方。
根据梆梆之前的版本,大概流程应该是不变的,在so进行初始化init,init_array或Jni_OnLoad函数下进行dex文件的解密,然后通过反射调用java层的dex加载函数,在加载时会通过hook系统函数,进行迷惑,实现一定的反dump;
2. so分析
so init_array段中并无重要逻辑,猜测逻辑是现在Jni_Onload函数中,并通过一定的函数名,变量名混淆进行一定程度防逆向;以下出现的部分的函数名经过重命名。
在整个过程中,几乎所有字符串内容均经过一定的加密,通过图中decodeString进行解密。
对函数的流程进行了一定的混淆。
关键点1:通过动静结合大致确定反射调用java进行dex加载的地方。
分别在case 11 32进行调用
关键点 2:我们根据梆梆以往的版本猜测会进行hook系统函数,hook的过程大概是:先通过dlopen,dlsym拿到函数地址后,再进行inline hook,所以实现hook的函数大概要具备至少两个参数,hook的目标地址,以及hook后会跳转的真正地址。在本例中通过查看交叉引用确定hook实现的外层函数,通过传入so内存加载的句柄,关键函数名,以及实际替换地址为参数。
p0C83F9688A8E4CD1B67CEBCC1115F169即为hook实现的入口函数,我们大概确定了hook实现的外层函数,剩下的就是用动调去验证;
图中只为示例,实际在dvm环境下。
关键点 3:找出反调试
So中并未找到反调试明显的特征,动调通过dex加载前后确定反调试位置为:
_ZNK17ObfuscatedAddressIPFvcEE8originalEv静态如下
在静态分析中完全没有发现反调试的特征(可能是我太菜了没发现),BLX R3后启动了反调试线程,此处反调试通过ida启动线程的提示,以及刚好在dex加载的前后才发现(涨见识了)。
关键点 4:开始动态调试
在上述关键函数下断点,由于此次仅有一处反调试,并且在dex加载后开启的反调试,也可以提前对BLX R3指令进行nop,实测过掉了反调试。
如图发现了dvmRawDexFileOpen被hook,此处R2寄存器的值为实际实现地址。
经过几个case之后调用dvmRawDexFileOpenArray这个函数,此函数为dump dex的关键点。
我们还可以看到不仅hook dvm中的部分加载关键函数,并且hook了libc中的一些基础函数如下:
到此其实已经可以进行脱壳了。
3. 未完成的
在这次脱壳中,未完成的有 未精准找出对SecData0.jar进行解密释放dex的过程以及梆梆对于第一次加载以及之后已有缓存文件的条件下对dex的加载流程不同的分析,上述脱壳方法适用于未有缓存文件的情况下,不过上述两点均有部分提示信息,相信还是可以找出来的。
附件: https://pan.baidu.com/s/1RcG5ktdQYnyYA4GkkuPFgw 密码:kaqs
忙于找实习,大概很久没写过博客了,这几天试着脱了下梆梆的免费版就来更新一次。
虽然处处碰壁,但我还是会坚持,希望自己春招后有个好去处。
emmmm,匆忙间才写好的博客,鉴于有些坑可能并没有提到,欢迎加q1254553524,一起讨论,一起学习。