Android SO 加壳(加密)与脱壳思路

   0x01 常见的Android SO加壳(加密)思路

    1.1 破坏Elf Header

    将Elf32_Ehdr 中的e_shoff, e_shnum, e_shstrndx, e_shentsize字段处理,变为无效值。由于在链接过程中,这些字段是无用的,所以可以随意修改,这会导致ida打不开这个so文件。

 

    1.2 删除Section Header

    同样的道理,在链接过程中,Section Header是没有用到的,可以随意删除,这会导致ida打不开这个so文件。

 

    1.3 有源码加密Section或者函数

    一是对section加壳,一个是对函数加壳。参考Android逆向之旅---基于对so中的section加密技术实现so加固Android逆向之旅---基于对so中的函数加密技术实现so加固

 

    1.4 无源码加密Section或者函数

    将解密函数放在另一个so中,只需保证解密函数在被加密函数执行前执行即可。和其他so一样,解密so的加载也放在类的初始化static{}中。我们可以在解密so加载过程中执行解密函数,就能保证被加密函数执行前解密。执行时机可以选在linker执行.init_array时,也可以选在OnLoad函数中。当然,解密so一定要放在被解密so后加载。否则,搜索进程空间找不到被解密的so。

    详细介绍和代码:无源码加解密实现 && NDK Native Hook 

 

    1.5 自定义loader来加载SO,即从内存加载SO

    我们可以DIY SO,然后使用我们自定义的loader来加载,破解难度又加大了。详解的介绍参考SO文件格式及linker机制学习总结(1)SO文件格式及linker机制学习总结(2)

 

    1.6 在原so外面加一层壳

    

     packed so相当于把loader的代码插入到原so的init_array或者jni_onload处,然后重新打包成packed so,加载这个so,首先执行init_array或者jni_onload,在这里完成对原so的解密,从内存加载,并形成soinfo结构,然后替换原packed so的soinfo结构。

 

    1.7 llvm源码级混淆

    

    Clang ( 发音为 /klæŋ/) 是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程语言。Clang 对源程序进行词法分析和语义分析,并将分析结果转换为 Abstract Syntax Tree ( 抽象语法树 ) ,最后使用 LLVM 作为后端代码的生成器。

    在Android llvm源码级混淆比较成熟的是Safengine。

    如果想自己研究llvm源码级混淆,可以参考Android LLVM-Obfuscator C/C++ 混淆编译的深入研究,通过修改NDK的编译工具,来实现编译混淆。

  • 11
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值