安卓脱壳

Ho1d_F0rward / 2024-08-18 / 原文

基础概念

其实壳本身也是一个 dex 文件,我们可以称之为 shell.dex文件。通常,在加壳之后,原 apk 文件
中的 dex 文件会被加密,于是我们没法直接破解和反编译它了。但是,shell.dex 文件可以解密已经加密了的 dex 文件,并运行解密后的 dex 文件,在这个过程中,shell.dex 文件承担了一个人口的角色。对已经加密的 dex 文件进行解密并运行解密结果,从而达到和运行加密前的 dex 文件同样的效果。
加壳过程分为如下三个步骤。

  • 对原 dex 文件加密:从需要加壳的 apk文件中,可以提取出一个 dex文件,我们称之为 origin.dex文件,利用某个加密算法(如异或、对称加密、非对称加密等)对该文件进行加密,可以得到一个 encrypt.dex 文件。
  • 合成新 dex 文件:合并加密得到的encrypt.dex文件和shell.dex文件,将encrypt.dex 文件追加在 shell.dex 文件后面,形成一个新的 dex 文件,我们称之为 new.dex 文件。
  • 替换 dex 文件:把 apk 文件中的 origin.dex文件替换成 new.dex 文件,并重新进行打包签名。

壳的分类

目前,壳已经发展到第三代了,上面介绍的只能算第一代。下面简单给三代壳归一下类。

  • 一代壳:整体加壳,整体保护,即上面介绍的加壳技术,对App中原本的dex文件整体加密后,将其和壳 dex 文件合成一个新的 dex文件。壳 dex 文件负责对 App 中的加密 dex 文件解密并还原,从而保证 App可以正常运行。对于这类壳,利用jadx-gui这种工具通常只能看到壳 dex文件,原 dex文件则看不到。
  • 二代壳:提供方法粒度的保护,即方法抽取型壳。保护力度从整体细化到了方法级别,也就是将 dex 文件中的某些方法置空,这些方法只在被调用的时候才会解密加载,其余时候则都为空。对于这类壳,利用jadx-gui反编译的结果中,方法全是nop指令。
  • 三代壳:提供指令粒度的保护,即指令抽取型壳。目前主要分为VMP壳和dex2C壳,就是将Java层的方法 Native化。VMP壳会对某些代码进行抽离,将其转变为中间字节码,VMP相当于一个字节码解释器,可以对中间字节码进行解释执行。dex2C 壳几乎把所有 Java 方法都等价进行了 Native 化

脱壳手法

一代壳

使用frida_dump

git clone https: //github .com/lasting-yang/frida_dump.git

或者我们去使用FRIDA-DEXDump

pip3 install frida-dexdump

二代壳

FART