能力值:
( LV3,RANK:30 )
|
-
-
26 楼
支持。不过有几点
1. .text理论上是完全可以加密的。
2. 多加节无所谓,只要把节表和strtab删掉即可。
3. 解密完后一定要cache刷新一下
4. __attribute__((constructor))这个方式也不错,但可以通过扩充init_array来完成。
|
能力值:
( LV9,RANK:310 )
|
-
-
27 楼
多谢指点! 不过我不太明白大大的意思:
1. 那如果.text都加密了,与CRT相关的代码如何处理?
2. 多加的节应该放在文件末尾吧? 直接插在中间的话,就需要把后面的segment移位偏移吧
3. 为什么要cache下?通过什么实现?
4. 声明 __attribute__((constructor))属性,编译器会把此函数加入init_array中。那扩充init_array是通过section属性声明来实现么?
求大大解释,小弟不胜感激!
|
能力值:
( LV3,RANK:30 )
|
-
-
28 楼
你说的CRT是加密解密代码吗?这个可以放到自定义的节中啊。
多加的节是放在末尾的
cache的原因是解密前的指令还有可能在cache当中,解密后刷新一下可以恢复解密后的指令。
扩充init_array可以新建一个init_array节啊,把原先的拷贝过去,重新做好重定位,就可以了。
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
这些需要被加壳来写代码配合。你新建的init_array要吗在被加壳中so写代码配合。要么扩充节。
而扩充节那要修复就多了。
|
能力值:
( LV9,RANK:310 )
|
-
-
30 楼
多谢大大指点!
之前小弟没说清楚,不好意思,。 我说的CRT代码是与运行库相关代码。 这些代码编译器自动加上放在.text段。 我之前测试过,如果直接把.text段全加密,是不行的。
前段时间,小弟做双重加密的时候,就遇到时灵时不灵的情况。听大大这么说,我估计是cache没刷。那cache怎么刷呢? 请大大指点下
|
能力值:
( LV9,RANK:310 )
|
-
-
31 楼
嗯,多谢大大指点!
|
能力值:
( 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
|
能力值:
( LV9,RANK:310 )
|
-
-
33 楼
多谢大大指点!
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
感谢分享。。。。。
|
能力值:
( LV7,RANK:100 )
|
-
-
35 楼
这么好的贴,不知说点什么好了,顶!!
|
能力值:
( LV9,RANK:210 )
|
-
-
36 楼
非常好的技术贴,描述也很详细易懂,赞一个。
|
能力值:
( LV2,RANK:10 )
|
-
-
37 楼
感谢楼主分享~~~~
|
能力值:
( LV9,RANK:310 )
|
-
-
38 楼
多谢大大鼓励支持!
|
能力值:
( LV2,RANK:10 )
|
-
-
39 楼
不错吖,感谢分享吖。
|
能力值:
( LV2,RANK:10 )
|
-
-
40 楼
我是顶你的,你帮我了我的大忙
|
能力值:
( LV9,RANK:310 )
|
-
-
41 楼
多谢支持鼓励。
|
能力值:
( LV2,RANK:10 )
|
-
-
42 楼
ThomasKing出品,必属精品,细细研读,收获不小,多谢谢大神。。
|
能力值:
( 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)
|
能力值:
( 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");
}
没有权限??
|
能力值:
( LV3,RANK:20 )
|
-
-
45 楼
mark
|
能力值:
( LV3,RANK:20 )
|
-
-
46 楼
ThomasKing兄,我试了你的解密代码解密出错,原因是nblock = ehdr->e_entry >> 16;的值为0,通过LOG发行ehdr->e_entry的值为0,这是为何,如何解决?多谢!
|
能力值:
( LV3,RANK:20 )
|
-
-
47 楼
ThomasKing兄,我试了你的解密代码解密出错,原因是nblock = ehdr->e_entry >> 16;的值为0,通过LOG发行ehdr->e_entry的值为0,这是为何,如何解决?多谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
48 楼
多谢分享!
|
能力值:
( LV3,RANK:20 )
|
-
-
49 楼
找到原因了,我改了elf head,把entry置为0了,多谢大神的无私分享!
|
能力值:
( LV3,RANK:20 )
|
-
-
50 楼
整个ELF文件大小 = e_shoff + e_shnum * sizeof(e_shentsize) + 1
应该为
整个ELF文件大小 = e_shoff + e_shnum * sizeof(e_shentsize) - 1吧?
|
|
|