脱壳练习(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,一起讨论,一起学习。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值