/CrackSo

Primary LanguageC++

CrackSo

CrackSo是一款通用化的脱壳工具,主要针对的仍是第2代壳(so本地加密型)

0x01 Android SO壳的发展历程

  • 1)so本地加密,导入内存解密,壳加载器跑完不再做其他事情
  • 2)程序正常运行时,壳可以重新接管控制权
  • 3)vmp保护(第4代加壳)

0x02 常见Android SO加壳思路

  • 1)破坏Elf Header:将Elf32_Ehdr 中的e_shoff, e_shnum, e_shstrndx, e_shentsize字段处理,变为无效值,导致IDA无法解析该SO文件
  • 2)删除Section Header:在链接过程中,Section Header因没有用到,可随意删除,导致ida无法打开该so文件
  • 3)有源码加密Section或者函数:(1)对section加壳 (2)对函数加壳
  • 4)无源码加密Section或者函数: 将解密函数放在另一个so中,只需保证解密函数在被加密函数执行前执行即可。执行时机的选择:(1)在linker执行.init_array时(2)在OnLoad函数中。注意:解密so一定要放在被解密so后加载,否则,搜索进程空间找不到被解密的so
  • 5)从内存加载SO(自定义loader加载):详细参考:SO文件格式及linker机制学习总结(1)SO文件格式及linker机制学习总结(2)
  • 6)packed SO(soinfo结构): 把loader的代码插入到原so的init_array或者jni_onload处,重打包成packed so,加载该so,首先执行init_array或者jni_onload,完成对原so的解密,从内存加载,形成soinfo结构,然后替换原packed so的soinfo结构
  • 7)llvm源码级混淆(Clang+LLVM): Clang作为LLVM 的一个编译器前端,对源程序进行词法分析和语义分析,形成AST(抽象语法树) ,最后用LLVM作为后端代码的生成器,详见: Android LLVM-Obfuscator C/C++ 混淆编译的深入研究
  • 8)花指令:在C语言中,内嵌arm汇编的方式,可加入arm花指令,迷惑IDA
  • 9)so vmp保护:写一个ART虚拟执行so中被保护的代码,但在手机上效率是一个问题

0x03 对应的脱壳思路

0x04 Reference