[TOC]
- 文件反编译:
DEX
文件、SDK
文件、SO
文件、资源文件; - 代码分析:
Java
代码、C/C++
代码、JS/HTML
代码; - 逆向破解:调试、抓包、
HOOK
注入、绕过签名校验等。
- 逆向分析:代码调试,漏洞挖掘,协议分析;
- 二次打包:
APP
盗版仿冒,插入广告、病毒木马,修改资源等; - 功能破解:
VIP
,会员,内购破解,去广告等。
功能 | 说明 |
---|---|
DEX 加固 |
对DEX 文件进行加壳保护,防止被静态反编译工具破解获取源码 |
防二次打包 | 应用在被非法二次打包后不能正常运行 |
防调试器 | 防止通过调试工具对应用进行非法破解 |
内存防dump |
防止运行时在内存中dump 数据 |
资源文件保护 | 加密资源文件,防止APK 资源文件被破解 |
H5 文件混淆 |
对JS/HTML 代码文件进行保护,防止破解分析 |
SDK 加固 |
对jar/AAR 文件进行保护,防止反编译获取源码 |
SO 加密保护 |
对SO 进行加壳,保护native 代码不被逆向分析 |
Android
加固:
DEX
加固;SDK
加固;- 资源加固;
SO
加固;H5
保护。
- **防反编译:**基础的做法是针对市面上出现的反编译工具做对抗,找漏洞,使得这些工具无法反编译。后来升级到
VMP
加固和java2c
的方案之后,防反编译已经不是主要问题了,因为被网易易盾加固后,即使反编译出来的内容也不是原来的代码了,仅仅是一些无用的外壳代码。 - **
VMP
加固:**主要是把dex
中的函数指令运行在壳的VMP
环境中,极大地提高了破解的门槛,让破解变得不可能。 - **
Java2c
:**通过把java
代码在加固阶段就转换为Native
层的c
代码,破解分析完全不可逆,在性能上相较于VMP
加固也有很大改进。
- 加固前的
classes.dex
和clases2.dex
直接暴露给了分析者; - 加固后只有一个
classes.dex
,用baksmali.jar/jeb
等工具查看,无法查看原app
代码逻辑,同时保护classes.dex
与classes2.dex
。
防止classes.dex
被逆向分析
- 加固前很容易反编译出
jar
包文件查看源码; - 加固后让反编译失败,并无从查看源码。
代码逻辑混淆替换
VMP
指令替换:
VMP
执行流程:
加固指令加密替换 --> APP
运行 --> 外壳执行 --> 加载加密DEX
指令 --> 易盾虚拟机解析指令
方法级,Java
代码彻底转换为Native
代码指令。与VMP
相比,用空间换时间。
java2c
原理:
加固后APK
一旦被调试,APP
异常退出,阻断调试。使用IDA Pro
调试APP
自动退出。
保护方式:
- 字符串加密;
- 混淆/去
log
/变量名混淆/函数名混淆; - 压缩;
- 游戏保护/平台识别;
- 防篡改/防加速。
保护方式:
- 加密后内容分块;
- 乱序插入干扰信息;
- 压缩处理,去除注释无用属性等;
- 平台识别,检测到非移动平台,不显示网页。
从代码安全、文件安全等方面对SDK
进行保护。对抗反编译手段,防止恶意篡改SDK
、窃取用户隐私信息等,有效提升SDK
保护的强度。
SDK
接口保持不变,对接入者透明;- 支持
JAR
包、AAR
包; - 可灵活指定加固保护的类和函数;
- 加固体积增量几乎无影响。
Java
代码保护
对JAR
包的保护,我们采取将重要逻辑代码抽离保护的方案,在运行时再动态修复回去,这样接入者在开发阶段仍然可以依赖JAR
包作为库文件直接引用接口函数,保持了接入者开发的透明。但是实际代码又是抽离的,我们测试时只选取了xxxx.jar
中类com.test.app.view.ExampleShell
的接口进行处理,那么接入者在打开JAR
包时只能看到如下的效果:
函数的指令代码被隐藏保护了,相应的,其它类和函数也可以依此方案处理。
由于代码逻辑被隐藏掉了,接入者看不到代码逻辑,也就无法分析甚至阉割SDK
的功能了。
SO
加固可以阻断IDA
分析so
及so
代码加密。SO
加固后IDA
将无法正常打开SO
进行分析,IDA
会显示如下报错:
SO
加固后与加固前已没有任何相似性,代码合字符串都被加密(左边为原始SO
,右边为加固后的SO
):
SO
导出函数隐藏:
SO
调用接口常常以Java_xxx_xxx_xxx
形式导出,从接口名字即可大致看出该函数的功能。SO
加固可将该函数完全隐藏,此处将反IDA
静态分析功能去掉做示例对比:
SO
加固反调试:
SO
加固反调试效果,IDA attach
到进程上后,IDA
面板都为空,获取不到指令和模块信息:
SO
加固保护优点:
优点 | 介绍 |
---|---|
无需源码 | 只需要编译好的so 即可加保护,相比于有些厂商提交源码的so 保护方式,更为安全,有效保护厂商的技术机密 |
关键函数动态加密 | 一些关键函数运行完后,对其进行动态加密,提升安全性 |
全平台支持 | 支持armeabi 、armeabi-v7a 、x86 、arm64-v8a 、x86_64 五大平台 |
防系统API HOOK |
Hook 一些系统API ,比如strcmp 、strcpy 等字符串操作函数就可以获取到很多关键信息。加保护后,这些hook 将获取不到任何信息 |
无法脱壳 | 直接对ELF 结构进行改造,仅在运行时存在可运行的代码,其它结构全部重构,任何时刻都不存在原生so 的内存 |