加密技术历史
下面整理安卓的加密技术的历史发展。
用人类历史发展的阶段去类比解释如下:
原始社会时期
主要方式:代码混淆
奴隶社会时期
主要方式: 自我校验
封建社会时期
主要方式: dex文件变形
资本主义社会时期
- Dex保护
- 隐藏dex文件
- 既然dex文件中包含了核心逻辑,那么把dex隐藏,再通过另外的方式加载起来,是不是就能达到保护dex的目的了呢?于是这成为一些第三方加固产品保护应用的方式。
- 他们通过加密甚至压缩(早期是不存在压缩的,只是单纯的加密)方式把dex转换为另外一个文件。而被加固后的apk里面的dex则是那些第三方加固产品用来启动和加载隐藏dex的入口,也就是壳。
- 感觉小花生v3.6.9 和 康美通 v.4.4.0就是这类?
- 总之是看不到dex文件
- 对dex文件进行变形
- 这里所说的变形,不同于封建社会时期提到的变形。这种办法不隐藏dex,而是让dex保留在外面,但是当破解者去分析这个dex的时候,会发现dex里面的内容是不完整的。
- 对dex结构进行变形
- 此类方法是比较复杂的,了解dex结构的人应该很清楚,dex结构中包含DexClassDef、ClassDataItem、DexCode,这些是dalvik虚拟机运行一个dex必不可少的部分,特别是DexCode,DexCode包含了虚拟机运行的字节码指令。
- 部分第三方加固产品开始尝试这种方式,他们的保护方案中可能抽取了DexCode中的部分,然后对字节码指令添加nop,或者连ClassDataItem和DexCode一同抽取,或者对上面提到的三个部分都做处理。抽取完之后,还要做修正、修复等工作,总之很烦锁。因为dex运行时有很多关于dex的校验,即使校验通过还有一些偏移问题。
- Dex都被抽取修改后为什么还能运行呢?那是因为在运行之前或者运行之中对这个内存中的dex做修正。修正工作也很复杂,一般选择在运行之前做修正,这样可以减少很大的工作量,甚至可能还需要借助hook来帮忙。
- 隐藏dex文件
- So保护
- 修改Elf头、节表
- 相关工具:
- 010 Editor
- IDA
- 相关工具:
- 选择开源加壳工具
- 最常用的:
- UPX壳
- 支持arm架构的ELF加固
- UPX壳
- 最常用的:
- 进程防调试、或增加调试难度
- 调试一个进程首先要ptrace这个进程
- 防止进程被ptrace
- 调试一个进程首先要ptrace这个进程
- 修改Elf头、节表
社会主义时期
- 之前遗留问题
- 隐藏dex遗留的问题
- 破解办法:
- 实现自定义rom
- 利用Inject原理将目标进程注入,代码进行hook系统函数来达到脱壳的目的
- FDex2,DumpDex感觉就是用的这个机制?
- 破解办法:
- Dex结构变形带来的弊端
- 安卓5.0新增了ART
- ART可以直接将dex编译为本地指令运行
- Dex结构变形遗留的问题很明显
- 兼容性
- ART模式下的编译问题
- 安卓5.0新增了ART
- ELF简单修改遗留问题
- UPX方面的劣势
- 虽然upx是最为so加壳的首选,但是upx代码逻辑复杂,很难达到定制,特别是让它同时支持多种架构
- -》基于上述原因一些第三方加固产品只是简单的利用upx加壳,并修改一些数据。不过很容易被有upx经验的人识破并脱壳
- 虽然upx是最为so加壳的首选,但是upx代码逻辑复杂,很难达到定制,特别是让它同时支持多种架构
- 隐藏dex遗留的问题
- 新防护技术
- llvm混淆
- 据说是新的llvm混淆,效果非常好,可以实现,即使被破解后,也很难看懂代码
VMP
- llvm混淆