很多开发者用过加固工具,但不一定清楚加固到底在底层改了什么。本文从DEX文件结构出发,解释加固在字节码层面的工作原理。

认识DEX文件:加固的底层战场

DEX(Dalvik Executable)是Android平台的可执行文件格式,一个APK中通常包含一个或多个DEX文件(classes.dex、classes2.dex等)。

DEX的基本组成

区域 内容 对逆向分析的意义
Header 文件头(魔数/校验和/各区域偏移量) 文件完整性校验的第一关
String Table 所有字符串常量 攻击者通过关键词搜索定位核心代码
Type Table 所有类型定义 了解代码中使用的类结构
Proto Table 方法原型 了解每个方法的参数和返回值
Field Table 字段定义 了解类的成员变量
Method Table 方法定义 了解每个方法的实现逻辑
Class Def 类定义索引 完整的类结构信息
Data 实际的字节码数据 核心代码逻辑所在

一句话理解:攻击者用Jadx打开APK,本质上就是在读取DEX文件中的这些区域,把它们还原成可读的Java代码。

易盾加固在DEX层面做了什么

基础DEX加密

最基础的加固操作,是把整个DEX文件加密后嵌入壳中。攻击者直接解压APK,拿到的是一个加密后的DEX文件——无法被Jadx直接反编译。

底层操作

  1. 将原始classes.dex加密
  2. 创建一个壳classes.dex,其中包含解密逻辑
  3. 壳在运行时解密原始DEX并加载到内存

弱点:代码总要在内存中解密才能执行,攻击者Dump内存即可拿到解密后的DEX。

函数级加密

比整体加密更精细的方案是:不是整体加密DEX,而是只加密关键方法。只有被调用时才解密执行。

底层操作

  1. 对Method Table中的关键方法进行加密
  2. 在方法入口处插入解密桩(Stub)
  3. 方法被调用时,桩先解密代码再跳转到原始逻辑

优势:解密窗口期极短——只有方法执行期间代码才是明文,执行完立即重新加密或丢弃。

VMP虚拟机保护

VMP不走"加密-解密"路线,而是彻底改变了代码的形态。

底层操作

  1. 将目标方法的Dalvik字节码转换为自定义的虚拟机指令集
  2. 删除原始的方法体
  3. 在Native层实现一个VM解释引擎
  4. 运行时由VM解释执行自定义指令

为什么难逆向:攻击者拿到的是自定义指令,不是标准字节码。没有任何标准工具能反编译这套指令——除非逆向出整个VM引擎的指令映射关系。

Java2C/DEX2C编译级加密

这是更深层的保护——从Java层彻底隐藏代码——直接从Java层消失。

底层操作

  1. 将DEX中的目标Java方法的字节码转换为C/C++代码
  2. 将C/C++代码编译为Native SO文件
  3. 从DEX中移除原始方法
  4. 修改方法的调用入口,指向SO中的Native实现

效果:Jadx中完全看不到该方法的存在。攻击者要想逆向,需要去对付编译后的机器码。

理解DEX结构,看懂易盾的分层保护逻辑

理解了DEX结构后,再看不同加固方案的能力差异,会更加清晰:

  • 整体加密:只是把DEX当黑盒加密,类似"把一本书锁进保险箱",但看的时候必须拿出来
  • 函数级加密 + VMP:深入到DEX内部,单独保护了关键方法,类似"把书中关键的几页替换成密文"
  • Java2C:直接在DEX层面"删掉"了关键方法,运行时调用的是另一个世界的副本

选型启发:如果核心代码高度集中在少量方法中,VMP/Java2C投入产出比最高——精准保护关键点。如果担心老版本被分析,整体加密提供基础防护即可。


从DEX加密到VMP到Java2C,易盾提供多层级的加固方案。申请试用可访问易盾应用加固产品页

Logo

网易易盾是国内领先的数字内容风控服务商,依托网易二十余年的先进技术和一线实践经验沉淀,为客户提供专业可靠的安全服务,涵盖内容安全、业务安全、应用安全、安全专家服务四大领域,全方位保障客户业务合规、稳健和安全运营。

更多推荐