一、什么是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 看到如下提示说明安装成功。

安卓逆向助手 java环境确实 android逆向工程_android

 

逆向编译

apktool 编译命令: apktool d [path][app-name].apk  。  d标志表示反编译(decode)。

编译完成后会生成和apk包名一样的文件夹,文件夹里包含资源文件和代码的文件。

安卓逆向助手 java环境确实 android逆向工程_反编译_02

 

打包编译

 当修改反编译后的文件或者代码之后,可以通过调用命令: apktool b [path] -o [target-app-name].apk 重新打包生成 apk 文件。

  • b: 表示build
  • o 表示指定生成的 apk 文件名称(output)
  • [path] 为源码文件夹

安卓逆向助手 java环境确实 android逆向工程_jar_03

生成签名文件

上面打包编译生成的 apk 由于没有签名,还不能直接安装。可以自己生成一个签名文件,首先需要先安装好 jdk 环境。

使用 keytool 命令可以生成签名文件,操作如下:

  •  -genkey 生成证书文件
  •  -alias 产生别名
  •  -keystore 指定密钥库的 .keystore 文件
  •  -keyalg 指定密钥的算法,这里指定为 RSA(非对称密钥算法)
  •  -validity 为证书有效天数

命令为: keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystor

然后根据提示输入对应内容

执行完成之后,会生成android.keystore文件

安卓逆向助手 java环境确实 android逆向工程_安卓逆向助手 java环境确实_04

 

执行签名

执行签名操作如下:

jarsigner -verbose -keystore android.keystore -signedjar [生成的apk文件名]-signed.apk [需加密的apk文件名].apk android.keystore

安卓逆向助手 java环境确实 android逆向工程_android_05

  • -verbose 指定生成详细输出
  • -keystore 指定数字证书存储路径
  • -signedjar 指定要签名的apk文件
  • android.keystore 别名