什么是Android 反编译
我们下载到的Android App
安装包是 Apk
文件(Android Application Package
) 。通过 Apk
文件,我们也可以得到这个应用的代码和资源文件,对应用进行修改。
那么我们如何获取这些文件呢?这就需要 Android 反编译技术。
计算机逆向工程(Reverse engineering
)也称为计算机软件还原工程,是指通过对他人软件的目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、等要素,某些特定情况下可能推导出源代码。
Android 反编译工具
Android
应用程序只是一个数据和资源的归档文件。即使这样,我们不能简单地解压缩归档包.apk
来获得可读的源代码。对于这些情况,我们必须依赖于将字节代码(如在classes.dex
中)转换为可读源代码。
什么是dex文件
dex
是Android
系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。
由于dalvik
是一种针对嵌入式设备而特殊设计的java
虚拟机,所以dex
文件与标准的class
文件在结构设计上有着本质的区别。
当java
程序编译成class
后,还需要使用dx
工具将所有的class
文件整合到一个dex
文件,目的是使其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加紧凑,实验表明,dex
文件是传统jar
文件大小的50%
左右
dex2jar
简介
dex2jar
可以将字节码.dex
文件转换为可读的.jar
文件。
下载安装
电脑上首先必须安装配置好Java
环境,点击下载地址:dex2jar下载地址 ,下载后直接解压即可,解压后可以看到如下图所示文件内容:
执行编译
1.用压缩软件打开apk
包,然后将classes.dex
文件解压出来放置到我们解压的dex2jar
目录中。
如果包中有classes.dex classes2.dex classes3.dex classes4.dex...
等文件,这是因为 apk
中方法数超过了 65536
个,使用了multidex support library
将一个 apk
中的 dex
文件分割成多个 dex
文件的缘故。相关知识可以搜索 android 65k
来进行了解。
- 打开
cmd
进入dex2jar
目录中,执行命令d2j-dex2jar.bat classes.dex
即可完成编译。
C:UsersShuqing
λ cd C:UsersShuqingDesktopdex2jar-2.0
C:UsersShuqingDesktopdex2jar-2.0
λ d2j-dex2jar.bat classes.dex
dex2jar classes.dex -> .classes-dex2jar.jar
如果想覆盖已经生成的classes-dex2jar.jar
文件,可以添加参数--force
。
3.解压完成之后我们可以看到多了一个文件classes-dex2jar
JD-GUI
JD-GUI是一个独立的图形实用程序,显示.class
文件的Java
源代码。您可以使用JD-GUI
浏览重建的源代码,以立即访问方法和字段。
下载地址:http://java-decompiler.github.io/
安装完成之后启动JD-GUI,将上面生成的classes-dex2jar
导入进来,依次点击File-Openfile
加载之后可以看到如下所示界面:
一般App为了保障安全都会进行代码混淆或加密,所以一般反编译的代码都是经过混淆的代码不能直接看到原始代码。
apktool
简介
apktool主要用于逆向apk
文件,是将.dex
文件转换为 smali
文件。smali
语言是Dalvik
的反汇编语言。
与 JD-GUI
相比,Apktool
的主要优点是它是双向的。这意味着如果你反编译一个应用程序并修改它,然后使用 Apktool
重新编译它,它能重新编译,并生成一个新的.apk
文件。然而,dex2jar
和 JD-GUI
不能做类似功能,因为它提供近似代码,而不是准确的代码。
下载安装
这里以Windows为例,其他环境请参考:https://ibotpeaches.github.io/Apktool/install/
- 下载 apktool.bat 打开页面后另外为文件名命名为:
apktool.bat
保存类型选择所有文件。 - 下载 apktool.jar 选择最新版本下载然后重命名为
apktool.jar
。 - 创建文件夹自定义名称,如
apktool
,然后将apktool.bat
和apktool.jar
放置在该文件夹中。 - 安装
JDK1.8
以上版本。
验证是否安装成功可以打开cmd
进入到apktool
文件目录,然后输入命令apktool
看到如下 提示说明安装成功。
Apktool v2.4.1 - a tool for reengineering Android apk files
with smali v2.3.4 and baksmali v2.3.4
Copyright 2014 Ryszard Wiśniewski <brut.alll@gmail.com>
Updated by Connor Tumbleson <connor.tumbleson@gmail.com>
usage: apktool
-advance,--advanced prints advance information.
-version,--version prints the version then exits
usage: apktool if|install-framework [options] <framework.apk>
-p,--frame-path <dir> Stores framework files into <dir>.
-t,--tag <tag> Tag frameworks using <tag>.
usage: apktool d[ecode] [options] <file_apk>
-f,--force Force delete destination directory.
-o,--output <dir> The name of folder that gets written. Default is apk.out
-p,--frame-path <dir> Uses framework files located in <dir>.
-r,--no-res Do not decode resources.
-s,--no-src Do not decode sources.
-t,--frame-tag <tag> Uses framework files tagged by <tag>.
usage: apktool b[uild] [options] <app_path>
-f,--force-all Skip changes detection and build all files.
-o,--output <dir> The name of apk that gets written. Default is dist/name.apk
-p,--frame-path <dir> Uses framework files located in <dir>.
For additional info, see: http://ibotpeaches.github.io/Apktool/
For smali/baksmali info, see: https://github.com/JesusFreke/smali
逆向编译
apktool
编译命令 apktool d [path] [app-name].apk
。d
标志表示反编译(decode
)。
C:UsersShuqingDesktopapktool
λ apktool d kaoyan.apk
I: Using Apktool 2.4.1 on kaoyan3.1.0.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:UsersShuqingAppDataLocalapktoolframework1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
编译完成后会生成和apk
包名一样的文件夹,文件夹里面包含资源文件和代码的文件。
打包编译
当修改反编译后的文件或者代码之后,我们可以调用命令apktool b [path] [target-app-name].apk
重新打包生成apk
文件。
C:UsersShuqingDesktopapktool
λ apktool b kaoyan -o new_kaoyan.apk
I: Using Apktool 2.4.1
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...
b
表示build
kaoyan3.1.0
表示上面反编译的文件名称o
表示指定生成的apk
文件名称
签名
生成签名文件
上面打包编译生成的apk
还不能直接安装,因为没有签名。因此还需要签名,我们可以自己生成一个签名文件,首先需要安装好jdk
环境。
使用keytool
命令可以生成签名文件,操作如下:
-genkey
产生证书文件-alias
产生别名-keystore
指定密钥库的.keystore
文件-keyalg
指定密钥的算法,这里指定为RSA
(非对称密钥算法)-validity
为证书有效天数,这里我们写的是20000
天
λ keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: 51zxw
您的组织单位名称是什么?
[Unknown]: 51zxw.net
您的组织名称是什么?
[Unknown]: 51zxw2020
您所在的城市或区域名称是什么?
[Unknown]: beijing
您所在的省/市/自治区名称是什么?
[Unknown]: beijing
该单位的双字母国家/地区代码是什么?
[Unknown]: 86
CN=sutune, OU=sutune.me, O=sutune2020, L=changsha, ST=hunan, C=86是否正确?
[否]: y
输入 <android.keystore> 的密钥口令
(如果和密钥库口令相同, 按回车):
再次输入新口令:
执行完成之后会生成android.keystore
签名文件。
执行签名
执行签名操作如下:
代码语言:javascript复制jarsigner -verbose -keystore android.keystore -signedjar new_kaoyan-signed.apk new_kaoyan.apk android.keystore
输入密钥库的密码短语:
....(此处省略N行)
正在签名: assets/newsdetail/ky_article.html
正在签名: assets/newsdetail/newsdetail.html
正在签名: assets/newsdetail/newsdetail_1.html
正在签名: assets/ShareSDK.xml
正在签名: assets/share_logo.png
正在签名: manifest
正在签名: com/tencent/mm/sdk/platformtools/rep5402863540997075488.tmp
jar signed.
-verbose
指定生成详细输出-keystore
指定数字证书存储路径-signedjar
指定要签名的apk
文件new_kaoyan-signed.apk
指签名后的apk
文件名new_kaoyan.apk
原来的apk
文件名android.keystore
别名
这样,就完成了对一个apk
的签名过程,然后就可以安装使用了。
注意:如果你的手机上原来就有这个
apk
,需先卸载,不然签名冲突无法安装。