APP加壳原理及常用脱壳方法介绍
前言
目前针对移动应用市场上安卓APP被破解、反编译、盗版丛生的现象,很多APP开发人员已经意识到保护APP的重要性。而对于移动应用APP加密保护的问题,如何对DEX文件加密尤为重要。对APP进行加壳能有效地遏制APP被反编译破解的行为。
1 加壳
1.1 什么是加壳
加壳是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作。大多数病毒就是基于此原理。是应用加固的一种手法对原始二进制原文进行加密/隐藏/混淆。
1.2 加壳作用
加壳的程序可以有效阻止对程序的反汇编分析,以达到它不可告人的目的。这种技术也常用来保护软件版权,防止被软件破解。
1.3 加壳原理
市面上主要的加壳原理:将原Dex文件加密,加密后的Dex文件和壳Dex文件一起重新打包,产生新的Dex文件。安卓虚拟机加载的时候,会从壳Dex文件的ProxyApplication类开始,执行attachBaseContext方法和onCreate方法。而壳Dex文件会在这两个方法里面实现原Dex文件的还原和加载,让虚拟机顺利启动APP。
在这个过程中,牵扯到三个角色:
1、加壳程序:加密源程序为解壳数据、组装解壳程序和解壳数据
2、解壳程序:解密解壳数据,并运行时通过DexClassLoader动态加载
3、源程序:需要加壳处理的被保护代码
1.4 加壳后的利与弊
1.5 如何辨别是否加壳
2 脱壳
2.1 脱壳原理
跟java类似,安卓的class都是由Classloader的loadClass方法加载的。跟java不同的是,每一个class对象都会有对应的dex对象属性跟相应的dex文件关联起来。利用xposed,将loadClass方法劫持住,每当loadClass方法调用完成后,用xposed执行后置方法。获取方法加载的class对象,然后调用getDex方法。拿到对应的dex文件引用,最后将dex文件序列成byte数据,写到自定义保存文件里面去。就能拿到脱壳后的dex文件。
2.2 常用脱壳软件
这里列举三个常用的脱壳软件:
一、反射大师 (需要搭建xposed环境)
二、DumpDex (需要搭建xposed环境且在真机下运行)
三、FRIDA-DEXDump(需要搭建frida环境)
2.2.1 反射大师
2.3.1 Dex2Java
2、该目录下执行Dex2Java.py
并传入jadx的绝对路径,我这里为C:\Users\admin\Desktop\jadx\bin\jadx
Dex2Java.py C:\Users\admin\Desktop\jadx\bin\jadx
3、执行完毕后,相同目录下将会得到一个sources文件夹,该文件夹能直接用IDE工具打开查看其java代码
2.3.2 Dex2Smali
准备工作
1、apktool
apktool用于将apk文件反编译为项目文件,下载地址:https://www.pcsoft.com.cn/soft/57847.html
2、baksmali.jar文件
basksmali.jar文件用于将dex文件转为smali代码,下载地址:https://bitbucket.org/JesusFreke/smali/downloads/
3、Dex2Smali脚本
该脚本用于将dex文件转为smali代码
自编写如下:
Dex2Smali.py
import os, sys
if __name__ == "__main__":
if len(sys.argv) < 2 :
print("start error!start need 2 arguments!")
sys.exit()
path = os.path.split(__file__)[0] + '\\'
files= os.listdir(path)
for file in files:
if file.find(".dex") > 0:
prefix = file.split('.')[0]
print(prefix)
sh = 'java -jar ' + sys.argv[1] + ' disassemble -o smali_' + ('' if 'classes'==prefix else prefix) + ' ' + file
print(sh)
os.system(sh)
3、执行完毕后得到多个classes文件