首页
论坛
课程
招聘
[原创]简单粗暴的so加解密实现
2014-8-26 21:42 142918

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

2014-8-26 21:42
142918
收藏
点赞7
打赏
分享
最新回复 (112)
雪    币: 179
活跃值: 活跃值 (31)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
cacorothuo 活跃值 2014-9-2 17:24
26
0
支持。不过有几点
1.  .text理论上是完全可以加密的。
2.  多加节无所谓,只要把节表和strtab删掉即可。
3.  解密完后一定要cache刷新一下
4. __attribute__((constructor))这个方式也不错,但可以通过扩充init_array来完成。
雪    币: 337
活跃值: 活跃值 (545)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 活跃值 6 2014-9-2 18:48
27
0
多谢指点! 不过我不太明白大大的意思:
1. 那如果.text都加密了,与CRT相关的代码如何处理?
2. 多加的节应该放在文件末尾吧? 直接插在中间的话,就需要把后面的segment移位偏移吧
3. 为什么要cache下?通过什么实现?
4. 声明 __attribute__((constructor))属性,编译器会把此函数加入init_array中。那扩充init_array是通过section属性声明来实现么?
求大大解释,小弟不胜感激!
雪    币: 179
活跃值: 活跃值 (31)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
cacorothuo 活跃值 2014-9-3 09:45
28
0
你说的CRT是加密解密代码吗?这个可以放到自定义的节中啊。
多加的节是放在末尾的
cache的原因是解密前的指令还有可能在cache当中,解密后刷新一下可以恢复解密后的指令。
扩充init_array可以新建一个init_array节啊,把原先的拷贝过去,重新做好重定位,就可以了。
雪    币: 45
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
丘比龙 活跃值 2014-9-3 09:52
29
0
这些需要被加壳来写代码配合。你新建的init_array要吗在被加壳中so写代码配合。要么扩充节。
而扩充节那要修复就多了。
雪    币: 337
活跃值: 活跃值 (545)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 活跃值 6 2014-9-3 11:20
30
0
多谢大大指点!
之前小弟没说清楚,不好意思,。 我说的CRT代码是与运行库相关代码。 这些代码编译器自动加上放在.text段。 我之前测试过,如果直接把.text段全加密,是不行的。
前段时间,小弟做双重加密的时候,就遇到时灵时不灵的情况。听大大这么说,我估计是cache没刷。那cache怎么刷呢? 请大大指点下
雪    币: 337
活跃值: 活跃值 (545)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 活跃值 6 2014-9-3 11:22
31
0
嗯,多谢大大指点!
雪    币: 179
活跃值: 活跃值 (31)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
cacorothuo 活跃值 2014-9-3 12:07
32
0
哦。我试过.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
雪    币: 337
活跃值: 活跃值 (545)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 活跃值 6 2014-9-3 13:07
33
0
多谢大大指点!
雪    币: 11
活跃值: 活跃值 (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
华仔在吗 活跃值 2014-9-3 21:45
34
0
感谢分享。。。。。
雪    币: 261
活跃值: 活跃值 (51)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wule 活跃值 2 2014-9-5 19:55
35
0
这么好的贴,不知说点什么好了,顶!!
雪    币: 227
活跃值: 活跃值 (37)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
boyliang 活跃值 5 2014-9-9 22:52
36
0
非常好的技术贴,描述也很详细易懂,赞一个。
雪    币: 42
活跃值: 活跃值 (82)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
风过果落 活跃值 2014-9-10 08:53
37
0
感谢楼主分享~~~~
雪    币: 337
活跃值: 活跃值 (545)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 活跃值 6 2014-9-10 10:50
38
0
多谢大大鼓励支持!
雪    币: 34
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fkunlam 活跃值 2014-9-10 11:14
39
0
不错吖,感谢分享吖。
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lifangjie 活跃值 2014-9-16 15:51
40
0
我是顶你的,你帮我了我的大忙
雪    币: 337
活跃值: 活跃值 (545)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 活跃值 6 2014-9-16 18:42
41
0
多谢支持鼓励。
雪    币: 7
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fanfu 活跃值 2014-11-28 17:07
42
0
ThomasKing出品,必属精品,细细研读,收获不小,多谢谢大神。。
雪    币: 75
活跃值: 活跃值 (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaogangha 活跃值 2015-2-4 16:43
43
0
有没有人遇到过。。程序报错
02-04 08:40:32.481: A/libc(948): Fatal signal 4 (SIGILL) at 0x4a2c13de (code=1), thread 948 (example.soshell)
雪    币: 75
活跃值: 活跃值 (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaogangha 活跃值 2015-2-11 08:53
44
0
也就是这个函数报错,
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");
        }
没有权限??
雪    币: 22
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ydyyes 活跃值 2015-2-14 21:53
45
0
mark
雪    币: 226
活跃值: 活跃值 (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Colbert仔 活跃值 2015-2-17 16:34
46
0
ThomasKing兄,我试了你的解密代码解密出错,原因是nblock = ehdr->e_entry >> 16;的值为0,通过LOG发行ehdr->e_entry的值为0,这是为何,如何解决?多谢!
雪    币: 226
活跃值: 活跃值 (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Colbert仔 活跃值 2015-2-17 16:35
47
0
ThomasKing兄,我试了你的解密代码解密出错,原因是nblock = ehdr->e_entry >> 16;的值为0,通过LOG发行ehdr->e_entry的值为0,这是为何,如何解决?多谢!
雪    币: 236
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fanslinux 活跃值 2015-2-17 16:36
48
0
多谢分享!
雪    币: 226
活跃值: 活跃值 (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Colbert仔 活跃值 2015-2-19 16:20
49
0
找到原因了,我改了elf head,把entry置为0了,多谢大神的无私分享!
雪    币: 226
活跃值: 活跃值 (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Colbert仔 活跃值 2015-2-19 18:25
50
0
整个ELF文件大小 = e_shoff + e_shnum * sizeof(e_shentsize) + 1

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