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

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

2018-6-3 21:23
16306
收藏
免费 2
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  八味茶   +5.00 2018/06/20
最新回复 (48)
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
请教一下,这里dump  代码的操作,data  =  idaapi.dbg_read_memory(0xEF214000,  0xEF2158CC  -  0xEF214000)  这里面的这个地址是怎么定位的。
2018-6-25 10:14
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
27
八味茶 请教一下,这里dump 代码的操作,data = idaapi.dbg_read_memory(0xEF214000, 0xEF2158CC - 0xEF214000) 这里面的这个地址是怎么定位的。
ida调试 ctrl+s 可以看到各个so在内存映射的地址区间;或者从 /proc/{pid}/maps表中查询
2018-7-1 20:45
0
雪    币: 29
活跃值: (295)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
28
JimmyJLNU 这个应该是腾讯为应用宝SDK定做的,官网直接加固的应该是libshella-2.*.*.so,libshellx-2.*.*.so,鹅厂真是一个出人才的地方,大数字的libjiagu.so都被破解,并 ...
腾讯给了你多少钱 我阿里巴巴给你三倍
2018-7-6 16:34
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
29
 v12 = 0x2B;
  v11 = 0x99u;
  v10 = 32;
  v9 = 21;
  v3 = (unsigned __int64)(unsigned int)dword_4008 << 16;// 0x100028cc << 16
  v7 = (unsigned __int16)dword_4008;
  v6 = (unsigned __int16)dword_4008 - ((unsigned int)dword_4008 >> 16);
  _mprotect(i + ((unsigned int)dword_4008 >> 16), (v6 + 4095) & 0xFFFFF000, 3);// mprotect(loadbase + 0x1000, 0x2000, Read_Write)
  for ( j = HIDWORD(v3); j <= v7; ++j )         // 解密代码区加密部分(0x1000~0x28cc)
  {
    v4 = *(_BYTE *)(i + j);
    *(_BYTE *)(i + j) ^= (unsigned __int8)(((v11 - v10) ^ j) + v9) ^ v12;
    *(_BYTE *)(i + j) += v10 & v9 ^ v11;
    v12 += (v11 + v10 - v9) & v4 & j;
    v11 += (j + v12) ^ v4;
    v10 ^= (v4 - v12) ^ j;
    v9 += j - (v4 + v12);
  }
  _mprotect(i + HIDWORD(v3), (v6 + 4095) & 0xFFFFF000, 5);// mprotect(loadbase + 0x1000, 0x2000, Read_Exe)
  与实际的dump地址,,data  =  idaapi.dbg_read_memory(0xEF214000,  0xEF2158CC  -  0xEF214000)  

原来是伪代码有问题,v3,v7,v6要实际调试才能知道
最后于 2018-8-31 10:42 被学编程编辑 ,原因:
2018-8-29 15:30
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
30
象这种壳,有办法直接拿到解密后的so吗
2018-8-29 15:34
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
31
longpoxin 调试步骤: 1. adb shell am start -D -n {pkgname}/{Activity} 2. ida android_server放到手机,运行,PC端idapro远程连接、 ...
我调的是抹掉section的,一jdb connect.进程就崩溃了。。。

IDA7.0有BUG,得用IDA6.8
最后于 2018-8-31 10:43 被学编程编辑 ,原因:
2018-8-30 11:12
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
32
学编程 象这种壳,有办法直接拿到解密后的so吗
可以从linker的 soinfo 中获取各个section信息,重新拼接出一个so
2018-9-2 14:36
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
33
楼主,请教个问题,采用am start -D -n 调试Jni_OnLoad的形式,那个APK里面用的是最原始的libYSDK.so吗,还是被替换抹去section的包?
2018-9-4 15:00
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
34
楼主,调试JNI_OnLoad的过程中,由于IDA分析的是解密后的SO,而APK内部用的是原始的SO.出现此界面
选择哪个可以好
最后于 2018-9-4 15:03 被学编程编辑 ,原因:
2018-9-4 15:01
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
35
楼主,请教个问题:)

v8 = dlopen(&cur_so_path, 0);

v7 = (int (__fastcall *)(int, int))dlsym(v8, "JNI_OnLoad");// 调用真正的JNI_OnLoad,当前这个JNI_OnLoad算是壳JNI_OnLoad吧


我在调试JNI_OnLoad过程中,cur_so_path是一个路径(/data/app/***/libYSDK.so
dlsym返回的结果是0



这个是正常的吗,看你的分析应该是一个值才对
2018-9-4 15:07
0
雪    币: 1144
活跃值: (1274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
学编程 楼主,请教个问题:) v8&nbsp;=&nbsp;dlopen(&amp;cur_so_path,&nbsp;0);v7&nbsp;=&nbsp ...
那是调用原始so的JNI_Onload,如果原始so不存在JNi_onload肯定是返回0呀
2018-9-5 22:31
0
雪    币: 1144
活跃值: (1274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
学编程 楼主,调试JNI_OnLoad的过程中,由于IDA分析的是解密后的SO,而APK内部用的是原始的SO.出现此界面选择哪个可以好
选no
2018-9-5 22:32
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
38
最后于 2018-10-30 16:21 被学编程编辑 ,原因:
2018-9-5 22:52
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
39
最后于 2018-10-30 16:22 被学编程编辑 ,原因:
2018-9-6 09:19
1
雪    币: 1144
活跃值: (1274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
是呀,那true_code 没有JNI_onload 他给你返回什么?当然是0
2018-9-6 09:39
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
41
seandong 是呀,那true_code 没有JNI_onload 他给你返回什么?当然是0
赞一个
最后于 2018-10-30 16:19 被学编程编辑 ,原因:
2018-9-17 16:20
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
42
最后于 2018-10-30 16:18 被学编程编辑 ,原因:
2018-9-18 15:55
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
43
longpoxin 可以从linker的 soinfo 中获取各个section信息,重新拼接出一个so
感觉难度不小,他的soinfo只有symtab,strtab,bucket是真正SO的,其他的都是shell的。
2018-10-30 16:21
0
雪    币: 177
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
这个影响动态调试吗
2019-3-27 15:49
0
雪    币: 1553
活跃值: (492)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
45
天堂猪 这个影响动态调试吗
没明白是指什么影响动态调试?壳没有发现有反调试,实际调试也没碰到坑。
2019-4-7 21:53
0
雪    币: 3571
活跃值: (755)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
46
还有没有完整还原so的分析打算呢
2019-4-15 11:45
0
雪    币: 431
活跃值: (2779)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
mark
2019-11-5 23:15
0
雪    币: 0
活跃值: (168)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
lscmxl liblegu.so = 乐固,这套方案我也实现过,非常相似但做的更多。
实现这套方案的话,需要对壳so进行格式修改吧,对hash 表 sym表 str表都要对照target so进行修改吧?
2021-4-2 11:49
0
游客
登录 | 注册 方可回帖
返回
//