如果对so库中的section进行加密可详见:
http://www.wjdiankong.cn/android%E9%80%86%E5%90%91%E4%B9%8B%E6%97%85-%E5%9F%BA%E4%BA%8E%E5%AF%B9so%E4%B8%AD%E7%9A%84section%E5%8A%A0%E5%AF%86%E6%8A%80%E6%9C%AF%E5%AE%9E%E7%8E%B0so%E5%8A%A0%E5%9B%BA/
加密思路:读取ELF文件,根据Section Header中的name来定位自定义的section。根据Section Header中的offset和size来提取该段字节并对其进行加密。同时修改ELF Header中的entry和shoff值来保存加密的大小和偏移量。
解密:执行so库方法之前,读取so的起始地址,并获取到ELF Header中的entry和shoff,根据加密规则推导出加密起始地址和大小。然后根据起始地址和大小获取对应的字节进行解密。
遇到问题:Android7.0后JNI库必须保留Section Headers。由于加密时修改了shoff值,导致加载so库值解析Section Headers 解析不了,包.dynamic section header was not found。
修改测量:shoff和entry目的是为了存储加密的偏移大小和加密的大小。我们可以使用entry高低16位来分别存储着两个值。即可解决该问题。