首页
社区
课程
招聘
[原创] 分析一个有趣的so双重壳
发表于: 2018-6-3 21:23 16306

[原创] 分析一个有趣的so双重壳

2018-6-3 21:23
16306

去年四五月份的时候客户反馈过一个so加壳的问题,分析后发现是和某Android应用市场SDK的libYSDK.so冲突。当时该so解壳过程中会操作linker的soinfo结构的部分数据,壳作者把dlopen返回的handle强制转成soinfo结构体指针,这操作个必然有兼容性问题。后来该壳也做了升级,其最新版本有一些挺有趣的技术点,跟大家分享下。

Ida直接打开:

函数列表只有31个sub_**(__mprotect是笔者改名来的), 再看下Section表 :


很多内容被擦掉了,dynsym 和 dynstr在7.0+上linker需要,必须保留,其他保留项对分析没什么用,壳的作者也保留了,这里直接抹掉elf-header中的section表偏移和大小,让ida使用动态链接表解析:


再用IDA打开后函数列表变了:

但是往下看代码区(JNI_OnLoad),代码加密了:

继续往后边拖拽,符号表竟然都在第二个loadsegment:


init解密壳

先考虑第一个loadsegment代码加密的问题,一般在linker的init中执行解密逻辑,init对应的那部分code一定是明文状态,greadelf –d libYSDK.so:


该so编译时的名字是“legu”,后来重命名为“YSDK”的,没有找到init段,只有init_array,跳过去看下:

看来sub_838就是解密函数了,贴上它的伪代码: 

对0x1000~0x28cc区间解密算法很简单,不过还是偷懒直接动态调试从内存扣了,ida脚本如下:

然后再替换到原so的0x1000~0x28cc上,再用IDA打开,JNI_OnLoad可以直接静态分析了(还原后的内容见附件):

IDA分析的第二个加载段中符号表是怎么回事呢?我们先看下010Editor打开该so后布局上的诡异之处:

很明显,文件末尾放着更多内容,这才是真正的业务逻辑相关的代码、数据,加载这些内容的代码就在JNI_OnLoad中,伪代码如下:


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

上传的附件:
收藏
免费 2
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  八味茶   +5.00 2018/06/20
最新回复 (48)
雪    币: 2141
活跃值: (7226)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
2
2018-6-4 09:39
0
雪    币: 2039
活跃值: (1468)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
和我的壳差不多,替换soinfo是在15年这么做的,当时是为了去掉对dlxxx函数的hook,提高兼容性。
2018-6-4 09:54
0
雪    币: 249
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
m
2018-6-4 09:55
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
十八垧 和我的壳差不多,替换soinfo是在15年这么做的,当时是为了去掉对dlxxx函数的hook,提高兼容性。
2018-6-4 12:04
0
雪    币: 1096
活跃值: (374)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
liblegu.so  =  乐固,这套方案我也实现过,非常相似但做的更多。
2018-6-4 15:04
0
雪    币: 103
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
问下作者,能提供下样本么  谢谢
2018-6-4 17:57
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
lscmxl liblegu.so = 乐固,这套方案我也实现过,非常相似但做的更多。
,  也有可能这个壳里边还有其他内容,比如关键业务代码是  self-modifying-code,而且不需要初始化的话,只分析到JNI_OnLoad发现不了。
2018-6-5 08:56
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
9
这个是SDK官方demo,libYSDK.so和我分析的是完全一样的
最后于 2018-6-5 08:58 被longpoxin编辑 ,原因:
上传的附件:
2018-6-5 08:57
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
感谢版主打优秀
2018-6-5 08:58
0
雪    币: 103
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
非常感谢作者
2018-6-5 11:19
0
雪    币: 103
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
longpoxin 这个是SDK官方demo,libYSDK.so和我分析的是完全一样的
请教下作者,apk可以使用am  start  -D  -n来调试运行。那么你写的加载器如何调试方式运行呢。万分感谢
2018-6-5 16:10
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
2018-6-5 23:15
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
14
kxyankai 请教下作者,apk可以使用am start -D -n来调试运行。那么你写的加载器如何调试方式运行呢。万分感谢
调试步骤:
1.  adb  shell  am  start  -D  -n  {pkgname}/{Activity}
2.  ida  android_server放到手机,运行,PC端idapro远程连接、  attach、下断点
3.  adb  forward  tcp:8700  jdwp:{pid}
4.  jdb  -connect  "com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700"
然后ida中继续运行调试就可以了
2018-6-6 09:32
0
雪    币: 4005
活跃值: (2193)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
楼主方便传一个原版的so吗
2018-6-6 11:29
0
雪    币: 149
活跃值: (171)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
感谢分享
2018-6-6 11:33
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
17
Umiade 楼主方便传一个原版的so吗
9楼拿吧
2018-6-6 11:42
0
雪    币: 506
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
请教一下,“让ida使用动态链接表解析”,这是怎么做的
2018-6-6 21:28
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
19
outed 请教一下,“让ida使用动态链接表解析”,这是怎么做的
抹掉Section信息后,ida会自动尝试通过动态链接表解析。不确定ida从哪个版本开始支持的,6.95  和  7.0  都是这样。
2018-6-7 08:58
0
雪    币: 275
活跃值: (254)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
20
不知道乐固这个是不是原创,还是从别人那里听来的
2018-6-10 17:34
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
longpoxin 这个是SDK官方demo,libYSDK.so和我分析的是完全一样的
Ida直接打开为啥提示错误呢
win7下选择  ELF  for  ARM  :Processor  type  MetaPC
Unexpected  attribute  section  format  ('
然后一路下去  打开  function  windows是空的  没有出现函数列表。
麻烦大神给解答一下,谢谢
2018-6-11 20:04
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
22
letboy Ida直接打开为啥提示错误呢 win7下选择 ELF for ARM :Processor type MetaPC Unexpected attribute section format (' ...
看19楼,ida版本是6.95或7.0么?
2018-6-13 18:19
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
longpoxin 看19楼,ida版本是6.95或7.0么?
是6.8.1500
2018-6-13 21:56
0
雪    币: 77
活跃值: (315)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
lscmxl liblegu.so = 乐固,这套方案我也实现过,非常相似但做的更多。
这个应该是腾讯为应用宝SDK定做的,官网直接加固的应该是libshella-2.*.*.so,libshellx-2.*.*.so,鹅厂真是一个出人才的地方,大数字的libjiagu.so都被破解,并做成脱壳机了,TX的还没有,厉害了!腾讯真是一个移动互联网的霸主,没有QQ和微信的生活,你敢想象吗?!
2018-6-23 02:44
0
雪    币: 77
活跃值: (315)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
longpoxin 这个是SDK官方demo,libYSDK.so和我分析的是完全一样的
因为这个是定制的,编译时就做了一次加固,所以可以理解为什么要重命名了。
2018-6-23 03:00
0
游客
登录 | 注册 方可回帖
返回
//