首页
社区
课程
招聘
[原创]分析一下乐固
2021-4-11 15:01 14169

[原创]分析一下乐固

2021-4-11 15:01
14169

前言

最近分析了一下乐固,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


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2021-4-11 23:01 被GitRoy编辑 ,原因:
收藏
点赞8
打赏
分享
最新回复 (14)
雪    币: 5233
活跃值: (3250)
能力值: ( LV10,RANK:175 )
在线值:
发帖
回帖
粉丝
挤蹭菌衣 1 2021-4-11 22:14
2
0
支持大佬 学习了
雪    币: 13374
活跃值: (4713)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2021-4-12 09:14
3
0
奇怪,为何有xposed就先填充?而不是反xposed?还为xposed铺路?
雪    币: 5348
活跃值: (5349)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 3 2021-4-12 09:21
4
1
tDasm 奇怪,为何有xposed就先填充?而不是反xposed?还为xposed铺路?
确实是这样的,并没有反xp,只能说乐固兼容性考虑的非常好。
雪    币: 3980
活跃值: (2355)
能力值: ( LV10,RANK:165 )
在线值:
发帖
回帖
粉丝
DMemory 3 2021-4-13 10:22
5
0
写的很好,很详细,点赞。
雪    币: 52
活跃值: (495)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2021-4-13 16:40
6
0
虽然看不懂 还是赞一个
雪    币: 5348
活跃值: (5349)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 3 2021-4-13 17:52
7
0
万里星河 虽然看不懂 还是赞一个
为啥看不懂啊老哥,感觉写的挺清楚的
雪    币: 3123
活跃值: (2776)
能力值: ( 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,今天看到楼主的帖子算是有点思路了,感谢
雪    币: 5348
活跃值: (5349)
能力值: ( 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那三个函数了,我回去调试看!
雪    币: 1248
活跃值: (637)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
shaoge 2 2021-4-17 10:37
10
0
要完全静态解密,还有许多工作要做,而且几乎每个版本都有小变化。
雪    币: 5348
活跃值: (5349)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 3 2021-4-17 13:22
11
0
shaoge 要完全静态解密,还有许多工作要做,而且几乎每个版本都有小变化。
明白,大佬已经搞了很多版本的静态脱壳机了吧
雪    币: 232
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_Y_751 2021-5-30 16:27
12
0
我有一个软件混淆了能不能帮忙分析一下  老哥
雪    币: 2063
活跃值: (3823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lhxdiao 2021-5-30 17:06
13
0
跟我分析的很像,如果是没Xposed的环境,可以手工解析opcode(基本上类似ijm,跑起来代码段都是明文的)。另分析一条捷径,可以直接hook安卓的log输出,里面会有一个TeaLog,有一些比较有意思的流程都在这个log里面。
雪    币: 5348
活跃值: (5349)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 3 2021-5-31 09:21
14
0
lhxdiao 跟我分析的很像,如果是没Xposed的环境,可以手工解析opcode(基本上类似ijm,跑起来代码段都是明文的)。另分析一条捷径,可以直接hook安卓的log输出,里面会有一个TeaLog,有一些比较 ...
可以可以!
雪    币: 528
活跃值: (598)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
_ZeroOne 2022-9-1 19:24
15
0
感谢分享
游客
登录 | 注册 方可回帖
返回