首页
社区
课程
招聘
[原创]简单粗暴的so加解密实现
发表于: 2014-8-26 21:42 172631

[原创]简单粗暴的so加解密实现

2014-8-26 21:42
172631
收藏
免费 32
支持
分享
最新回复 (117)
雪    币: 188
活跃值: (237)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
26
支持。不过有几点
1.  .text理论上是完全可以加密的。
2.  多加节无所谓,只要把节表和strtab删掉即可。
3.  解密完后一定要cache刷新一下
4. __attribute__((constructor))这个方式也不错,但可以通过扩充init_array来完成。
2014-9-2 17:24
0
雪    币: 370
活跃值: (1184)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
27
多谢指点! 不过我不太明白大大的意思:
1. 那如果.text都加密了,与CRT相关的代码如何处理?
2. 多加的节应该放在文件末尾吧? 直接插在中间的话,就需要把后面的segment移位偏移吧
3. 为什么要cache下?通过什么实现?
4. 声明 __attribute__((constructor))属性,编译器会把此函数加入init_array中。那扩充init_array是通过section属性声明来实现么?
求大大解释,小弟不胜感激!
2014-9-2 18:48
0
雪    币: 188
活跃值: (237)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
28
你说的CRT是加密解密代码吗?这个可以放到自定义的节中啊。
多加的节是放在末尾的
cache的原因是解密前的指令还有可能在cache当中,解密后刷新一下可以恢复解密后的指令。
扩充init_array可以新建一个init_array节啊,把原先的拷贝过去,重新做好重定位,就可以了。
2014-9-3 09:45
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
这些需要被加壳来写代码配合。你新建的init_array要吗在被加壳中so写代码配合。要么扩充节。
而扩充节那要修复就多了。
2014-9-3 09:52
0
雪    币: 370
活跃值: (1184)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
30
多谢大大指点!
之前小弟没说清楚,不好意思,。 我说的CRT代码是与运行库相关代码。 这些代码编译器自动加上放在.text段。 我之前测试过,如果直接把.text段全加密,是不行的。
前段时间,小弟做双重加密的时候,就遇到时灵时不灵的情况。听大大这么说,我估计是cache没刷。那cache怎么刷呢? 请大大指点下
2014-9-3 11:20
0
雪    币: 370
活跃值: (1184)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
31
嗯,多谢大大指点!
2014-9-3 11:22
0
雪    币: 188
活跃值: (237)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
32
哦。我试过.text完全加密,倒没出现过问题。时灵时不灵的问题就是没有刷新cache的缘故。
ba8K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4@1j5h3y4C8L8%4k6W2M7X3k6D9L8%4N6Q4x3X3g2U0L8$3#2Q4x3V1k6I4N6h3g2K6N6r3W2G2L8Y4y4Q4x3V1j5$3x3o6b7$3y4K6p5$3i4K6u0r3K9r3!0%4i4K6u0V1j5$3I4W2j5i4u0Q4x3X3c8S2L8X3c8Q4x3X3c8A6L8Y4k6S2L8r3W2V1j5i4c8W2i4K6u0V1j5i4u0E0i4K6u0V1N6U0N6Q4x3X3c8H3M7X3!0U0k6i4y4K6L8%4u0Q4x3X3c8U0j5h3y4Z5k6g2)9J5k6r3k6J5L8$3#2Q4x3X3c8#2M7$3g2J5i4K6u0V1L8h3!0V1k6g2)9J5k6r3!0F1i4K6u0V1L8r3W2F1N6i4S2Q4x3X3b7J5i4K6u0V1y4W2)9J5k6o6x3#2

或者google   flush cache
2014-9-3 12:07
0
雪    币: 370
活跃值: (1184)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
33
多谢大大指点!
2014-9-3 13:07
0
雪    币: 11
活跃值: (90)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
感谢分享。。。。。
2014-9-3 21:45
0
雪    币: 275
活跃值: (299)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
35
这么好的贴,不知说点什么好了,顶!!
2014-9-5 19:55
0
雪    币: 233
活跃值: (148)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
36
非常好的技术贴,描述也很详细易懂,赞一个。
2014-9-9 22:52
0
雪    币: 54
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
感谢楼主分享~~~~
2014-9-10 08:53
0
雪    币: 370
活跃值: (1184)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
38
多谢大大鼓励支持!
2014-9-10 10:50
0
雪    币: 34
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
不错吖,感谢分享吖。
2014-9-10 11:14
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
我是顶你的,你帮我了我的大忙
2014-9-16 15:51
0
雪    币: 370
活跃值: (1184)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
41
多谢支持鼓励。
2014-9-16 18:42
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
ThomasKing出品,必属精品,细细研读,收获不小,多谢谢大神。。
2014-11-28 17:07
0
雪    币: 75
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
有没有人遇到过。。程序报错
02-04 08:40:32.481: A/libc(948): Fatal signal 4 (SIGILL) at 0x4a2c13de (code=1), thread 948 (example.soshell)
2015-2-4 16:43
0
雪    币: 75
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
也就是这个函数报错,
if(mprotect((void *) ((base + info.st_value) / PAGE_SIZE * PAGE_SIZE), npage, PROT_READ | PROT_EXEC | PROT_WRITE) != 0){
                print_debug("mem privilege change failed");
        }
没有权限??
2015-2-11 08:53
0
雪    币: 26
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
45
mark
2015-2-14 21:53
0
雪    币: 228
活跃值: (95)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
46
ThomasKing兄,我试了你的解密代码解密出错,原因是nblock = ehdr->e_entry >> 16;的值为0,通过LOG发行ehdr->e_entry的值为0,这是为何,如何解决?多谢!
2015-2-17 16:34
0
雪    币: 228
活跃值: (95)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
47
ThomasKing兄,我试了你的解密代码解密出错,原因是nblock = ehdr->e_entry >> 16;的值为0,通过LOG发行ehdr->e_entry的值为0,这是为何,如何解决?多谢!
2015-2-17 16:35
0
雪    币: 236
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
多谢分享!
2015-2-17 16:36
0
雪    币: 228
活跃值: (95)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
49
找到原因了,我改了elf head,把entry置为0了,多谢大神的无私分享!
2015-2-19 16:20
0
雪    币: 228
活跃值: (95)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
50
整个ELF文件大小 = e_shoff + e_shnum * sizeof(e_shentsize) + 1

应该为
整个ELF文件大小 = e_shoff + e_shnum * sizeof(e_shentsize) - 1吧?
2015-2-19 18:25
0
游客
登录 | 注册 方可回帖
返回