脱壳练*(2)-最新免费版梆梆加固脱壳笔记

发布于:2021-10-24 07:42:53

直接开始吧,末尾有附件。


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,一起讨论,一起学*。

相关推荐

最新更新

猜你喜欢