DEX文件混淆加密

时间:2024-04-07 15:17:12

0x00 前言

混淆加密主要是为了隐藏 dex 文件中关键的代码,力度从轻到重包括:静态变量的隐藏、函数的重复定义、函数的隐藏、以及整个类的隐藏。混淆后的 dex 文件依旧可以通过 dex2jar jade 等工具的反编译成 Java 源码,但是里面关键的代码已经看不到了。
java 效果图:
DEX文件混淆加密

smali 效果图:
DEX文件混淆加密

源码地址和使用说明在 github 上 hidex-hack

0x01 dex格式分析

dex 文件格式在上一篇有进行了比较详细的介绍,具体可看dex文件格式分析,这里简单的介绍一下整个 dex 文件的布局。

1.header(dex头部)
header 概述了整个 dex 文件的分布情况,包括了:magicchecksumsignaturefile_sizeheader_sizeendian_tag,linkmapstring_idstype_idsproto_idsfield_idsmethod_idsclass_defsdata

  • checksum 和 signature 是校验值,修改后需要对其进行修复
  • string_idstype_idsproto_idsfield_idsmethod_ids 作为类型数组节区(我瞎起的)保存了不同类型的值
  • class_defs 存储了类的定义也是我们修改的重点
  • data 是数据存储区,包括所有的数据

2.类型数组节区
类型数组节区包括了string_idstype_idsproto_idsfield_idsmethod_ids。分别表示:字符串,类型,函数签名,属性,函数。每个节区都保存了对应类型数据数组,可以用 010Editor 分析二进制文件数据。
属性示例:
DEX文件混淆加密

3.类定义
类定义是修改的重点,这里保存了所有类的结构,也是整个 dex 文件中结构最复杂的部分。其中包括了:静态属性变量、成员数形变量,虚函数,直接函数,静态函数等数据。

0x02 实现功能

通过分析 dex 文件格式,现在可以实现的混淆加密主要包括四种:

  1. 静态变量隐藏
  2. 函数重复定义
  3. 函数隐藏
  4. 类定义隐藏

四种混淆加密的实现方式都是通过修改 class_def 结构体中字段实现的。可以通过 json 格式了解一下 class_def 的结构(这里只列出来要用到的字段):


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

{
"class_def": {
"class_idx": 01
"static_values_off": 000,
"class_data_off": 001,
"class_data": {
"direct_methods_size": 001,
"virtual_methods_size": 002,
"virtual_methods":[
{
"code_off": 003
},
{
"code_off": 004
}
]
}
}
}

字段含义:

  • class_idx: 类名序号,值是type_ids的一个index
  • class_def: 类定义结构体
  • static_values_off: 静态变量值偏移
  • class_data_off: 类定义偏移
  • class_data: 类定义结构体
  • direct_methods_size: 直接函数个数
  • virtual_methods_size: 虚函数个数
  • virtual_methods: 虚函数结构体
  • code_off: 函数代码偏移

通过上面的字段介绍其实很容易得到四个功能的实现方案,下面一个一个介绍。

1.静态变量隐藏

static_vaules_off 保存了每个类中静态变量的值的偏移量,指向 data 区里的一个列表,格式为encode_array_item,如果没有此项内容,该值为0。所以要实现静态变量赋值隐藏只需要将 static_values_off 值修改为0。
实现效果:
DEX文件混淆加密

这里的静态数组数据没有成功隐藏,因为我也不知道怎么搞。