上篇文章介绍了so加壳需要了解的elf文件格式回顾点我,这篇将介绍so加壳的原理,并且给出python版源码。

1.加壳原理

本加固方案实现对特定section进行整体加密。对特定section进行整体加密需要解决以下几个问题:

  • 如何找到特定的section
  • 使用什么方法加密
  • 是否可以简化解密操作

读过上一篇blog的话,第一个问题就很简单了。只要读取每个section的名字与要被加密的section名比较即可;第二个问题没有固定答案,只要能正常加解密,无论什么方法都行,我在测试例子中只是用了简单的+1,取余操作;第三个问题在上一篇blog中有提到,so在运行时其实并不会关心section,运行过程中只与segment有关(programer header指向的内容),所以so头部中与section相关的字段都可以被任意修改,根据这个原理可以简化解密操作,只需子加密时提前将被加密的section偏移和大小写入so头部,这样在解密时就无需再次遍历section。另外so头部中e_entry并没有被使用,所以也可以用来存储section的相关信息。

本次加壳方案采用的简化方法如下图:

elfsec7

加密时将特定section的长度和偏移分别写入so头部的e_entry和e_shoff字段,这样不仅能简化解密操作,还可以破坏整个elf文件格式,这样经过加壳后的so无法通过readelf,IDA等工具分析。

2.加壳代码

python实现的加壳完整代码如下:

3.加壳效果

经过加壳后的so无法使用readelf,ida等工具进行静态分析:

elfsec9

elfsec10

 

 

观看更多有关 的文章?

*

+
跳转到评论