so加固技术分析
07 Dec 2020发展历程
- so本地加密,导入内存解密,壳加载器跑完不再做其他事情
- 程序正常运行时,壳可以重新接管控制权
- vmp保护(第4代加壳)
思路
-
- 破坏ELF(so)文件结构 —— 增加静态分析难度
- 破坏ELF Helader: 对e_shoff, e_shnum, e_shstrndx, e_shentsize字段处理,变为无效值,导致IDA无法解析该SO文件
- 删除Section Header: 在动态链接过程中, Section Header不会被用到,可以随意删除,导致IDA无法打开该文件
- 破坏ELF(so)文件结构 —— 增加静态分析难度
- 2.动态加解密
- 2.1. 有源码so可以加密Section或者函数 —— 解密过程放到源so或者java层
- 2.2 无源码加密Section或者函数: 将解密函数放在另一个so中,只需保证解密函数在被加密函数执行前执行即可。执行时机的选择:(1)在linker执行.init_array时(2)在OnLoad函数中。注意:解密so一定要放在被解密so后加载,否则,搜索进程空间找不到被解密的so。解密后需要写文件,会被动态获取
- 针对这种情况,考虑从内存中加载so(自定义linker)
-
- 代码混淆
- llvm源码级混淆(Clang+LLVM): Clang作为LLVM 的一个编译器前端,对源程序进行词法分析和语义分析,形成AST(抽象语法树) ,最后用LLVM作为后端代码的生成器
- 花指令:在C语言中,内嵌arm汇编的方式,可加入arm花指令,迷惑IDA
- 代码混淆
-
- so vmp保护:写一个ART虚拟执行so中被保护的代码
性能问题
- 破坏ELF结构基本不会影响性能
- 加解密会影响性能
- 代码混淆对性能影响比较大
- so vmp分为有源和无源,会影响性能。
结论
可以先解决静态分析问题,动态加解密先从静态加载搞起