首页
社区
课程
招聘
[原创]---------手脱定制版的android SO UPX壳
发表于: 2017-10-23 17:54 15886

[原创]---------手脱定制版的android SO UPX壳

2017-10-23 17:54
15886

       加固厂商SO的加壳,一般都是采用UPX壳实现的。如果用原生的进行加壳,可以使用原生UPX进行脱壳。但是对于定制的UPX壳使用原生UPX是无法脱壳的。定制版的UPX一般有以下2种形式:

   

       1  将里面的魔术字符串改掉。下图是UPX源码中定义的魔术字以及修改后的例子:


                                  源码中的魔术字                                                                                           修改后的例子

二  UPX壳loader

        加壳一般需要加密和解密2个过程,UPX壳也不例外。UPX壳的解密是由 upx loader实现的。在UPX加壳过程中,将loader放在init段,确保loader先获得程序执行的控制权。

        Loader程序是由汇编代码实现的,下面是upx源码中针对arm平台的汇编代码:

        下面是loader在dynamic中的位置:

                                                                      

        当loader开始运行时的步骤如下:

        从loader执行流程可以看到如下:

        1、loader是由汇编代码内嵌实现的,因此要解决重定位的问题,所以其中的函数调用都是使用系统调用实现的,比如mmap 以及mprotect等函数。        

        2、loader 程序要将加密数据解密,解密后的数据要覆盖加密数据。

        3、由于upx使用的是压缩算法,因此解密后的数据会比加密的数据大,此时loader程序也会被解密后的数据覆盖,所以loader在解密前要拷贝到内存中执行。


三  linker加载so

       Android系统的linker加载是通过dlopen函数实现的。以4.4源码为例如下:

                                                               

四  手脱UPX壳的原理

        前面说加壳一般需要加密和解密2个过程,UPX壳也一样。我们手脱指的是不用研究加密算法,动态脱壳。当upx的loader执行完后,代码也解密完成了,并且加密的数据被解密后的数据覆盖,是否可以直接在这个时间点,将SO从内存中dump出来就可以了呢?

        确实可以在这个时间点将so从内存中dump出来,但是只有这样是不行的,需要解决以下4个问题:

             ●  由于此时代码已经重定位完成,dump后plt段等信息已经包含了重定位后的信息,也就是绝对地址,此时静态用IDA打开,很多函数都无法识别。

             ●  Segment段中的Load段需要恢复,UPX加密后将原始的load段的大小由原来的加密前的大小改成了加密后的大小,因此需要修复。

             ●  Segment段中的 dynamic段在文件中的偏移需要修复。UPX将dynamic在文件中的偏移改变了。

             ●  section 段修复。对于section段的修复论坛里面有很多,这里就不讲了。

        因此解决了前面三个问题就可以实现手脱UPX壳了。

       

1 解决重定位的问题

        我们的目标是手脱UPX壳,因此我们可以将linker中执行重定位代码nop掉,就是不让linker执行重定位的操作,自然PLT等段中就不会带有重定位的信息。

        通过前面分析linker加载so的过程,soinfo_link_image调用soinfo_relocate实现重定位,下图是源码中相关调用:

                                                                      

       下面是在linker中的对应的汇编代码( 对于如何找到对应汇编代码,只要在IDA中搜索字符串“[ relocating %s plt ]”就可以找到):

        直接将上面的对sub_1464函数改成对应的”c0 46 c0 46”(thumb nop指令) 就可以。我们知道如果SO本身又调用了其他的SO,此时会优先加载其他的SO,因此注意nop的时机,避免将不是UPX壳的其它SO重定位也执行不了。

 

2 如何恢复segment段的load的大小

        我们知道upx壳的loader会对加密的数据进行解密,解密后的数据大小,就是对应load段的大小。

下面是UPX壳部分数据排列顺序:

       l_info p_info b_info结构大小都为12个字节,如下:

        根据上面的loader地址我们知道第一个l_info结构的地址为0x6508。见下图:

                                                               


       我们先不关心l_info和p_info结构,我们只关心b_info结构。对于b_info结构,第一个成员是压缩前的大小,第二个成员是压缩后的大小。因此我们可以通过b_info获取到被压缩数据的压缩前的大小:

       从上图可知,第一个b_info结构对应的压缩块:


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 5
支持
分享
最新回复 (20)
雪    币: 1039
活跃值: (355)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
thx  for  share.
2017-10-23 18:00
0
雪    币: 25430
活跃值: (4777)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很详细,学习了,可惜手头没有样本
2017-10-23 18:14
0
雪    币: 4
活跃值: (137)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
不错  正在看UPX脱壳相关
2017-10-23 21:03
0
雪    币: 562
活跃值: (4347)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
不错,顶一个
2017-10-25 10:01
0
雪    币: 4
活跃值: (137)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
可以加个Q号么  有个问题想请教下
2017-10-25 15:01
0
雪    币: 1037
活跃值: (1780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大婶叼叼叼
2017-10-26 11:03
0
雪    币: 1385
活跃值: (376)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
按步骤来操作,然而并不对
2017-12-5 23:06
0
雪    币: 19097
活跃值: (1345)
能力值: ( LV15,RANK:936 )
在线值:
发帖
回帖
粉丝
9



晨曦风海

按步骤来操作,然而并不对
能否说出问题在哪里?
2017-12-6 00:07
0
雪    币: 42
活跃值: (492)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
"?AJM"这个是好像是ijm早期的版本,这个版本能够UPX  -d  脱壳出来(把?AJM改回去就行),样本可以去找ijm加壳后的APP,壳so就是
2017-12-6 14:43
0
雪    币: 1385
活跃值: (376)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
oooAooo 晨曦风海 按步骤来操作,然而并不对 能否说出问题在哪里?
大神,其实你的思路是对的,结合其他资料我也成功unpack一个定制的upx的so
2017-12-8 23:26
0
雪    币: 2872
活跃值: (185)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
晨曦风海 大神,其实你的思路是对的,结合其他资料我也成功unpack一个定制的upx的so[em_63][em_63][em_63]
能分享下  练习的so么
2017-12-11 16:50
0
雪    币: 139
活跃值: (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
nice
2017-12-12 10:36
0
雪    币: 1385
活跃值: (376)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
长泽雅美 能分享下 练习的so么
抱歉了,这个不能分享出来
2017-12-12 23:09
0
雪    币: 3549
活跃值: (941)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
15
2018-4-27 18:39
0
雪    币: 116
活跃值: (354)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
grate
2018-6-11 16:15
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
问下楼主,如何定位到UPX的魔术字符段位置。
2018-6-19 16:51
0
雪    币: 5
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习
2018-6-21 16:01
1
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
一个可执行elf,upx壳,脱壳前是这样的,和楼主的不一样,不知道怎么处理了。
上传的附件:
2019-10-13 04:25
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
2019-10-13 12:54
0
雪    币: 6257
活跃值: (1177)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
默默的学习着
2019-10-14 09:20
0
游客
登录 | 注册 方可回帖
返回
//