一、什么是Android 反编译
计算机逆向工程(Reverse engineering)也称为计算机软件还原工程,是指通过对他人软件的目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、等要素,某些特定情况下可能推导出源代码。
二、Android 反编译工具
Android 应用程序只是一个数据和资源的归档文件。即使这样,我们不能简单地解压缩归档包.apk来获得可读的源代码,必须依赖于将字节代码(如在 classes.dex中) 转化为可读源代码。
1、dex文件
dex是 Android 系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。
由于 dalvik 是一种针对嵌入式设备而特殊设计的 java 虚拟机,所以 dex 文件与标准的 class 文件在结构设计上有着本质的区别。
当 java 程序编译成 class 后, 还需要使用 dx 工具将所有的 class 文件整合到一个 dex 文件,目的是使其中各个类能够共享数据,在一定程度上降低了冗余, 同时也是为你教案结构更加紧凑,实验表明, dex文件是传统 jar 文件大小的50% 左右。
2、apktool 工具
apktool 主要用于逆向 apk文件,是将 .dex 文件转换为 smali 文件。smali 语言是Dalvik 的反编译语言。
apktool 是双向的,可进行反编译和重新编译。
下载安装
- 下载 apktool.bat 开发页面后右键另存为bat文件,文件命名为:apktool.bat 保存类型选择所有文件
- 下载 apktool.jar 选择最新版本下载然后重命名为 apktool.jar。
- 创建文件夹自定义名称,如apktool,然后将 apktool.bat 和 apktool.jar 放置在该文件夹中。
- 安装 JDK1.8 以上版本。
打开cmd 进入到 apktool文件目录,输入命令 apktool 看到如下提示说明安装成功。
逆向编译
apktool 编译命令: apktool d [path][app-name].apk 。 d标志表示反编译(decode)。
编译完成后会生成和apk包名一样的文件夹,文件夹里包含资源文件和代码的文件。
打包编译
当修改反编译后的文件或者代码之后,可以通过调用命令: apktool b [path] -o [target-app-name].apk 重新打包生成 apk 文件。
- b: 表示build
- o 表示指定生成的 apk 文件名称(output)
- [path] 为源码文件夹
生成签名文件
上面打包编译生成的 apk 由于没有签名,还不能直接安装。可以自己生成一个签名文件,首先需要先安装好 jdk 环境。
使用 keytool 命令可以生成签名文件,操作如下:
- -genkey 生成证书文件
- -alias 产生别名
- -keystore 指定密钥库的 .keystore 文件
- -keyalg 指定密钥的算法,这里指定为 RSA(非对称密钥算法)
- -validity 为证书有效天数
命令为: keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystor
然后根据提示输入对应内容
执行完成之后,会生成android.keystore文件
执行签名
执行签名操作如下:
jarsigner -verbose -keystore android.keystore -signedjar [生成的apk文件名]-signed.apk [需加密的apk文件名].apk android.keystore
- -verbose 指定生成详细输出
- -keystore 指定数字证书存储路径
- -signedjar 指定要签名的apk文件
- android.keystore 别名