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

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

2014-8-26 21:42
167552
收藏
免费 25
支持
分享
最新回复 (116)
雪    币: 188
活跃值: (167)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
26
支持。不过有几点
1.  .text理论上是完全可以加密的。
2.  多加节无所谓,只要把节表和strtab删掉即可。
3.  解密完后一定要cache刷新一下
4. __attribute__((constructor))这个方式也不错,但可以通过扩充init_array来完成。
2014-9-2 17:24
0
雪    币: 370
活跃值: (1180)
能力值: ( 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
活跃值: (167)
能力值: ( 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
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
30
多谢大大指点!
之前小弟没说清楚,不好意思,。 我说的CRT代码是与运行库相关代码。 这些代码编译器自动加上放在.text段。 我之前测试过,如果直接把.text段全加密,是不行的。
前段时间,小弟做双重加密的时候,就遇到时灵时不灵的情况。听大大这么说,我估计是cache没刷。那cache怎么刷呢? 请大大指点下
2014-9-3 11:20
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
31
嗯,多谢大大指点!
2014-9-3 11:22
0
雪    币: 188
活跃值: (167)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
32
哦。我试过.text完全加密,倒没出现过问题。时灵时不灵的问题就是没有刷新cache的缘故。
http://stackoverflow.com/questions/6046716/how-clear-and-invalidate-arm-v7-processor-cache-from-user-mode-on-linux-2-6-35

或者google   flush cache
2014-9-3 12:07
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
33
多谢大大指点!
2014-9-3 13:07
0
雪    币: 11
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
感谢分享。。。。。
2014-9-3 21:45
0
雪    币: 275
活跃值: (254)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
35
这么好的贴,不知说点什么好了,顶!!
2014-9-5 19:55
0
雪    币: 233
活跃值: (148)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
36
非常好的技术贴,描述也很详细易懂,赞一个。
2014-9-9 22:52
0
雪    币: 56
活跃值: (242)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
感谢楼主分享~~~~
2014-9-10 08:53
0
雪    币: 370
活跃值: (1180)
能力值: ( 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
活跃值: (1180)
能力值: ( 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
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
45
mark
2015-2-14 21:53
0
雪    币: 228
活跃值: (75)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
46
ThomasKing兄,我试了你的解密代码解密出错,原因是nblock = ehdr->e_entry >> 16;的值为0,通过LOG发行ehdr->e_entry的值为0,这是为何,如何解决?多谢!
2015-2-17 16:34
0
雪    币: 228
活跃值: (75)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
47
ThomasKing兄,我试了你的解密代码解密出错,原因是nblock = ehdr->e_entry >> 16;的值为0,通过LOG发行ehdr->e_entry的值为0,这是为何,如何解决?多谢!
2015-2-17 16:35
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
多谢分享!
2015-2-17 16:36
0
雪    币: 228
活跃值: (75)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
49
找到原因了,我改了elf head,把entry置为0了,多谢大神的无私分享!
2015-2-19 16:20
0
雪    币: 228
活跃值: (75)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回
//