首页
社区
课程
招聘
[原创]乐固加固(17年1月)逆向分析
发表于: 2017-5-11 16:35 31294

[原创]乐固加固(17年1月)逆向分析

2017-5-11 16:35
31294

   

   

虽然乐固做了一些反调试的东西,不过感觉比 Ali 更好分析一点,很多情况并不是反调试越厉害加固就越好。感觉 Ali 在加固方面做的比乐固有意思,Ali 利用 SP 来储存返回地址和参数所以整个流程很混乱,基本看上去就是在各种 JUMP,而乐固仍然是常规规的函数调用和返回方式,流程清晰很多。


另外想说一下,之前把对 Ali 壳的分析发到看雪了,可能因为我只把大概的流程放上去了所以有评论觉得这是一个很没技术的秒脱壳子,至于究竟这个壳子怎么样,好不好脱,完全没有自己尝试过。个人感觉 Ali 的壳子对于初学者来说有很深的学习意义,有不少有意思的细节,建议分析。


* 为了阅读这篇文章时更好理解文中所说内容,下面大多形如 [sub_] [unk_xxx] [loc_xxx] 的函数都经过了重命名以帮助理解。


下面言归正传,下图是反编译 apk 后的 smali 差异,另外还新增了一个 lib 文件夹。

lib 文件夹的格式如下所示。

bugly 相关的可以不用管了,是腾讯的一个类似上报 bug 之类的玩意和加固没有关系。smali 层面只做了一些简单的混淆,不做过多分析了(其实是时间太久忘了 ....),直接进入 Native 层。


直接动态 IDA 挂上,然后在 Linker 和 libdvm.so 对应调用 .init / .init_array / JNI_Onload 的偏移地址下好断点,这样下断点的好处是可以无视 .so 的 ELF 头被修改的情况直达想要的位置,也上个图简单示意一下。

触发断点之后说明运行的到了 .init / .init_array / JNI_Onload 的出发点,然后 F7 即可进入对应 .so ELF 内执行的代码位置。


根据上面说的来到 .init 在 .so 里的位置,偏移量是 [+ 14D4],IDA 静态 + F5 之后得到伪代码,下面是完善函数名之后的伪代码。

略过很多字节变换,略过重命名后的 mmprotect() 和 cacheflush_syscall(),整段其实就执行了一个函数 [sub_8630],跟进之后发现伪代码如下。

可以看出是 pthread_create 新开了一个线程执行 anti_init 函数,进入 F5 查看 anti_init 函数伪代码。

一个 while(1) 的循环里面根据不同的条件执行了 3 个 raise() 函数,不用管具体是根据什么样的 3 个条件执行的 raise() 操作,直接把 [BL  j_raise] 对应 arm 十六进制码修改成 [Mov R1, R1] 就可以达到 Bypass 反调试的目的,这个地方殊途同归的 Bypass 方法很多。

还是同样的方法来到 JNI_Onload 在 .so 里的位置,偏移量是 [+ 65A8],IDA 静态查看,F5 之后得到对应的伪代码,动态 + 静态结合调试可以还原出大部分函数的真实目的。

这里需要重点关注的就是 dlopen 和 dlsym 这两个函数了,其他都是一些字符串操作的内容,对脱壳没有什么太大的帮助。其实 dlopen 都不需要关注了,直接在最后 J_dlsym 这里下断,F7 。


   

跳到 .so 外的一段内存,很明显是程序 mmap 进来的内容,至于怎么 mmap mmprotect 之类的不需要做太多关注,看看这里指向代码的功能。


   

还是一堆的赋值操作略过不表,看到执行了 [sub_7860EFB8] [sub_7860E7C4] 两个函数,分别看下这两个函数的作用。


   


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
打赏 + 12.00雪花
打赏次数 3 雪花 + 12.00
 
赞赏  TzdnerC   +10.00 2018/05/27
赞赏  CCkicker   +1.00 2017/05/31
赞赏  土豆粉   +1.00 2017/05/16
最新回复 (39)
雪    币: 93
活跃值: (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排mark
2017-5-11 16:49
0
雪    币: 8901
活跃值: (4213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很多图不见了~~~~~~~~
2017-5-11 18:09
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了
2017-5-11 18:21
0
雪    币: 1037
活跃值: (1780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
写的很不错,楼主挂了好多图片
2017-5-11 19:02
0
雪    币: 1039
活跃值: (355)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢分享
2017-5-11 20:03
0
雪    币: 120
活跃值: (1673)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
图用的是blogspiot的图床国内被墙了  所以图片挂了  明天楼主上来更新    :  )
2017-5-11 20:11
0
雪    币: 120
活跃值: (1673)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8

脱壳小能手 哈哈哈

2017-5-11 20:12
0
雪    币: 1696
活跃值: (2297)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
膜拜大神!
2017-5-11 23:03
0
雪    币: 54
活跃值: (705)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
围观大神~
2017-5-12 09:30
0
雪    币: 360
活跃值: (84)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
11
更新了一下图片  应该没有问题了  另外加上了pdf和加固后的apk
2017-5-12 10:03
0
雪    币: 102
活跃值: (2050)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
犀利,不错不错。
2017-5-12 10:07
0
雪    币: 42
活跃值: (492)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13

2017-5-13 11:27
0
雪    币: 360
活跃值: (84)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
14
DragKing 楼主仅仅是逆玩吧,除了Anti部分nop掉有价值,其他都是F5粘贴的。里面有几个关键点都没说,比如SO加壳分两部分,initarray是解密壳自身JNI_OnLoad,JNI_O ...
举个简单例子,一段字符串是动态变换的,是直接看关键时间点这个字符串整体,还是一个个看这个字符串的拼接过程。
另外你说我只是在贴  f5  代码,我开头说了sub,loc,unk  为了更好的理解我都直接重命名不讨论。这样是为了少发代码这种难得看的东西,现在代码贴了这么多已经很影响阅读了,我还要把所有没什么意义的的都发出来分析一边?
你问我“为什么不把全部函数nop掉”,这个我真不知道,要不你去问问开发  ……
2017-5-13 13:03
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
新手,IDA  还不太会使用,请问你的F5  怎么使用的,RegisterNative  函数的参数是怎么显示的呢?
2017-5-16 14:35
0
雪    币: 360
活跃值: (84)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
16
NigelX 新手,IDA 还不太会使用,请问你的F5 怎么使用的,RegisterNative 函数的参数是怎么显示的呢?
网上找  IDA  手册或者书看看就好了
2017-5-16 17:33
0
雪    币: 224
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
乐固加固过app后,无法反编译,一直is  waiting  for  the  debugger  on  port  8100...,没法调试,怎么处理?
2017-5-23 16:22
0
雪    币: 360
活跃值: (84)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
18
Zn哥 乐固加固过app后,无法反编译,一直is waiting for the debugger on port 8100...,没法调试,怎么处理?
反编译跟debugger没关系
2017-5-23 16:39
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
为啥乐固没想到,楼主是东北哪嘎哒的?
2017-5-23 16:58
0
雪    币: 224
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20




Caln

反编译跟debugger没关系

找到原因了,jdb-connectcom.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700时,端口号应该写成ddms中对应进程的端口号。谢谢。

2017-5-24 11:03
0
雪    币: 224
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
比较新的libshella_2.10.2.3.so    IDA  静态已经无法分析了。
2017-5-24 12:04
0
雪    币: 360
活跃值: (84)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
22
Zn哥 比较新的libshella_2.10.2.3.so IDA 静态已经无法分析了。
指的是IDA不能打开.so文件还是没有函数列表?
2017-5-24 14:30
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
23
cool  job先记录一下
2017-5-24 14:35
0
雪    币: 3712
活跃值: (1401)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
24
楼主说的QEver  的脚本是什么?求告知
2017-5-24 14:36
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
不明觉厉
2017-5-25 11:41
0
游客
登录 | 注册 方可回帖
返回
//