首页
论坛
课程
招聘
[脱壳反混淆] [原创]分析一下乐固
2021-4-11 15:01 5782

[脱壳反混淆] [原创]分析一下乐固

2021-4-11 15:01
5782

前言

最近分析了一下乐固,20年中的一个版本,简单记录一下,感兴趣的小伙伴可以看一看。文中图片出现的字段和函数名绝大部分都是根据自己理解改变的,可能存在不准的情况,大家有需要就参考一下。如果文章内容有错误,请大家指正,并多多包含。

Java层

定位com.zane.heartrate.MyWrapperProxyApplication->initProxyApplication()

 

 

下面直接进入So层

So

init_array

简单看一下init_array
图片描述

JNI_ONLOAD

可以看到已经被ollvm了
图片描述

 

IDA 7.5 F5配合动态调试,可以慢慢探索里面的流程。

读取加密数据

我们上面Java层分析到,有个比较重要的assets文件,会在Java层copy到应用的私有目录中


定位偏移sub_DAC4,我们先介绍一个Globle,一个重要的结构体。

 

下面依然可以看到一些重要的变量都存在Globle中

 

好,结构体介绍完了,下面介绍第一个阶段的核心,定位sub_D01C: 这个函数主要负责加载起来那个加密的文件,并且读取文件中的内容,赋值Globle结构体,这里取的内容都比较重要,后面会用到

 

加密文件中读取数据

加载Dex

定位0x7098:这个函数是整个流程的核心,流程比较长

 


下面开始

sub_700C


那我们先看Dex是怎么出来的?
跟进sub_6E30(prepareDex)

经过上面的流程,Dex已经准备好了,现在继续分析如何把数据填充回去
跟进sub_8D98

上面说了,在有xp的情况下,会提前填充。如果没有xp的情况下,在哪里填充的呢?还记得我们上面说过,有xp的时候,乐固重新注册这个defineclassnative函数.

继续跟进sub_BD7C

脱壳

这个方法应该能脱掉近2年的所有乐固壳
hook libc的strstr

1
2
3
4
5
6
int new_strstr(char *str1, char *str2) {
    if (strcmp("xposed", str2) == 0) {
        return 1;
    }
    return old_strstr(str1, str2);
}

然后再hook libart的DefineClassNative对dex进行整体dump.

 

这种情况,dump出的dex全部是完整的。

反调试

sub_156FC这个函数中(原理rtld_db_dlactivity相关的,这个很多大佬已经分析过了)

一个问题

有个问题一直没解决,就是乐固会在新的进程中load dex,我本地动态调试过waitpid后一直卡住(后面我nop掉了waitpid,让乐固走了另一种方案),这种情况该怎么处理呢?希望大佬们能指点小弟一下。

致谢

谢谢大家的观看!!!
资源链接:
链接:https://pan.baidu.com/s/1U9FTvL78FT3n4p4XnBTgag
提取码:fdtd


第五届安全开发者峰会(SDC 2021)议题征集正式开启!

最后于 2021-4-11 23:01 被GitRoy编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (10)
雪    币: 3947
活跃值: 活跃值 (1370)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
挤蹭菌衣 活跃值 1 2021-4-11 22:14
2
0
支持大佬 学习了
雪    币: 7488
活跃值: 活跃值 (579)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2021-4-12 09:14
3
0
奇怪,为何有xposed就先填充?而不是反xposed?还为xposed铺路?
雪    币: 5974
活跃值: 活跃值 (2344)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 活跃值 3 2021-4-12 09:21
4
1
tDasm 奇怪,为何有xposed就先填充?而不是反xposed?还为xposed铺路?
确实是这样的,并没有反xp,只能说乐固兼容性考虑的非常好。
雪    币: 3599
活跃值: 活跃值 (1004)
能力值: ( LV10,RANK:165 )
在线值:
发帖
回帖
粉丝
DMemory 活跃值 3 2021-4-13 10:22
5
0
写的很好,很详细,点赞。
雪    币: 9
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万里星河 活跃值 2021-4-13 16:40
6
0
虽然看不懂 还是赞一个
雪    币: 5974
活跃值: 活跃值 (2344)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 活跃值 3 2021-4-13 17:52
7
0
万里星河 虽然看不懂 还是赞一个
为啥看不懂啊老哥,感觉写的挺清楚的
雪    币: 3034
活跃值: 活跃值 (1369)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
dayday向上8 活跃值 2 2021-4-16 13:04
8
1
在0x指纹大佬的帖子中https://bbs.pediy.com/thread-260251.htm有提到三个函数的HOOK(fstat,mmap,munmap),<这样在 libart.so 底层函数的代码中对文件进行内存映射的时候,返回的内存地址就是已经在内存中解密好的 Dex 文件的存放地址,而不是空的 Dex 文件>,和楼主中的三个函数有点不同,但感觉意思一样,不过我在实践0x指纹大佬的帖子时候用的是android7.1并没有hook这几个函数(他用的是android5)而是直接跳过了。那个案例(17年9月)中也检测了xposed,但并不是反xposed,今天看到楼主的帖子算是有点思路了,感谢
雪    币: 5974
活跃值: 活跃值 (2344)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 活跃值 3 2021-4-16 20:26
9
0
dayday向上8 在0x指纹大佬的帖子中https://bbs.pediy.com/thread-260251.htm有提到三个函数的HOOK(fstat,mmap,munmap),,和楼主中的三个函数有点不同,但感觉 ...
感谢大佬,明白为什么会hook那三个函数了,我回去调试看!
雪    币: 123
活跃值: 活跃值 (139)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
shaoge 活跃值 2 2021-4-17 10:37
10
0
要完全静态解密,还有许多工作要做,而且几乎每个版本都有小变化。
雪    币: 5974
活跃值: 活跃值 (2344)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 活跃值 3 2021-4-17 13:22
11
0
shaoge 要完全静态解密,还有许多工作要做,而且几乎每个版本都有小变化。
明白,大佬已经搞了很多版本的静态脱壳机了吧
游客
登录 | 注册 方可回帖
返回