SO加固之section加密
前言
没有前言
实例
为了简单演示section加密,那就使用默认的native stringFromJNI函数吧
JNI代码
原理
都知道c语言程序一般都是从main函数开始执行,但是需要知道的是,有__attribute__((constructor))属性的函数会先于main函数执行,这就为加壳解密带来了契机。其次,还可以通过__attribute__((section(".mytext")))的方式将特定的函数编译到so文件中特定的节区中。那么,我们就可以通过加密特定的节区实现加固so文件。再通过__attribute__((constructor))优先于main函数的方法,进行section解密,最后运行解密后的节区里面的代码。
代码
1 |
|
这里主要要注意一下,网上有些博主,mprotect函数修改内存权限,大多写的是mprotect((void*)(text_addr/PAGE_SIZE * PAGE_SIZE), 4096*nsize, PROT_EXEC|PROT_READ),多次测试,程序很多时候都不能运行,也看了网上很多文章,也没有说清楚。
通过mprotect修改text_addr/PAGE_SIZE * PAGE_SIZE权限为可读时,会修改不成功,我从开始写section加密到调试“程序无法运行”,一直找原因,用了4天左右,还是只知道修改内存权限,这里会爆“SIGSEGV (signal SIGSEGV: address access protected (fault address: 0xa7d380c4))”错误。有博主https://blog.csdn.net/earbao/article/details/120308836 在文章中这样解释,还是感觉有问题。
section加密程序
原理
通过遍历节区名的方式,找到so文件的特定节区,然后读取节区偏移和大小,将其偏移所在的位置进行加密,然后将节区偏移、大小等数据保存在so header里面,即e_entry、e_flags、e_shentsize等部位,因为动态链接库的这些东西都没用。
代码
1 |
|
演示

探究
通过对secion加密来实现对函数加密,方法虽然不错,但是也能被破解,破解方法很简单,直接在内存里面dump解密后的代码就行了。
参考链接
实例下载:https://pan.baidu.com/s/148Mr1Hb6Lu-fuJh3cd0t4w (kata)
ELF文件格式分析:https://www.cnblogs.com/lhc-java/p/5549774.html
https://bbs.pediy.com/thread-191649.htm
基于对so中的section加密技术实现so加固:https://blog.csdn.net/qq_44906504/article/details/89512706