首页
社区
课程
招聘
upx原理分析
2019-1-2 21:14 17215

upx原理分析

2019-1-2 21:14
17215

该文章主要针对android平台下的so文件使用upx加壳做的分析,加壳命令为:upx.out --android-shlib test.so

 

简单的elf文件结构这里就不重复说明了,如果还不是很清楚可以先了解下elf文件结构。图1为upx加壳后的so文件格式,下面分别多各部分做说明。

 

elf header:这部分保持跟原so文件相同,不过里面部分数据需要修改,比如section headers的偏移等。

 

program headers:该部分会对第一个LOAD段的size大小做修改(因为使用了upx壳后体积变小了),其他数据保持不变。

 

sections:这里存放着原so中的节,这些节包括:"DT_GNU_HASH","DT_HASH", "DT_STRTAB","DT_SYMTAB","DT_REL","DT_RELA","DT_JMPREL","DT_VERDEF","DT_VERSYM","DT_VERNEEDED",因为在so中跟重定位相关的节不能够被加壳,并且在文件中的偏移位置需要保持不变,所以一般情况下是在.text节之后开始做压缩处理。

 

section headers:upx压缩壳会将section headers表上移,放到上一部分的sections后面,并且不做任何压缩处理,原因是在高版本的android系统中会对section headers做校验,需要读取section headers中的数据,因此需要以明文的形式存放在so中。

 

.shstrtab:这个节用于存放各个section的名字。

 

l_info:为一个结构体,其格式如下,其中magic为’7fUPX’,各个产商会对此做修改。

 

{
LE32 l_checksum;
LE32 l_magic;
LE16 l_size;
unsigned char l_version;
unsigned char l_format;
}

 

p_info:为一个结构体,其格式如下,
{
unsigned p_progid;
unsigned p_filesize;
unsigned p_blocksize;
}

 

compressed data:被压缩的数据,即实现对代码段做加密。

 

b_info:为一个结构体,其格式如下,其中sz_unc为压缩后数据的大小,sz_cpr为压缩前数据的大小,b_method为使用的压缩方法。

 

{
unsigned sz_unc;
unsigned sz_cpr;
unsigned char b_method;
unsigned char b_ftid;
unsigned char b_cto8;
unsigned char b_unused;
}

 

other info:保存着可以传递给stub的参数,其中包括:dt_init地址,xct_off(sections中最后的地址)等

 

stub:为整个upx的核心部分,该部分用于运行时解压并还原compressed data。

 

2th LOAD:为so的第二个LOAD段,因为第二个LOAD段中的dynamic节涉及重定位环节,所以upx无法对其做压缩处理。

 

PackHeader:为upx的尾部,保存一些upx相关信息。

 

图1 upx结构图

stub解压流程

在upx的stub中主要有三个部分,分别为:main、supervise、hatch。

 

1.在main中使用mmap开辟新空间A,将compressed data、supervise、hatch拷贝到该空间A中。并将pc指针指向A中的supervise开始执行指令。

 

2.supervise中包含这解压过程中所需要的代码包括:
解压算法decompress、过滤器unfilter、其他。在该部分中使用mmap并使用MAP_FIXED参数来开辟内存,该内存地址为原so加载时的空间地址,MAP_FIXED这个参数能够覆盖原来mmap的内存空间,确保解压后数据与原so保持一致。对compressed data做解压处理,并将hatch拷贝到第一个LOAD末尾(多余空间)。在拷贝以及解压完成后,将pc指针跳转到hatch,执行hatch。

 

3.hatch用于unmap释放在1中开辟的空间A,并跳转到原so的dt_init中,如果原so没有dt_init则跳转到linker中。

 

该过程流程图如下:

 

图2


[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2019-1-3 16:45 被CCkicker编辑 ,原因: 调整格式
收藏
点赞6
打赏
分享
最新回复 (8)
雪    币: 51
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
leonrain 2019-1-3 09:27
2
1
不错
雪    币: 95
活跃值: (246)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
小心情 2019-1-3 10:35
3
1
内容很棒,排版有点不好看
雪    币: 5274
活跃值: (1832)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wanttobeno 2019-1-4 09:37
4
0
感谢分享!
雪    币: 122
活跃值: (1455)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 1 2019-1-7 18:30
5
0
mark
雪    币: 2649
活跃值: (1541)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hhhaiai 2019-1-12 20:13
6
0
mark
雪    币: 1
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
吴思泉 2019-1-15 15:40
7
0
mark
雪    币: 351
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
五天 2019-1-22 15:41
8
0
mark
雪    币: 2111
活跃值: (3842)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
st0ne 1 2021-9-1 21:59
9
0
请问一下大佬,这种so的壳是从哪里开始执行的?stub就是dt_init吗?
游客
登录 | 注册 方可回帖
返回