赞
踩
首先是 apk,即安卓程序的安装包。Apk 是一种类似于 Symbian Sis 或 Sisx 的文件格式。通过将 APK 文件直接传到 Android 模拟器或 Android 手机中执行即可安装。
而 apk 文件实际上就是一个 MIME 为 ZIP 的压缩包,只不过后缀名进行了更改。
我们可以直接把 .apk 后缀的文件修改成 .zip 后缀的压缩包格式,然后解压后就可以看到内部的文件结构,就像下面这样:
文件夹结构说明:
可在下面两种下载中选择一种方式下载:
(我这里使用的是 apktool_2.9.1.jar 版本)
将 apk 安装包和下载的 apktool 放在同一目录。
假如我的安装包叫 base.apk ,我想把它反编译到 test 文件夹下,反编译命令如下:
java -jar apktool_2.9.1.jar d base.apk -o test
该命令将会自动新建一个 test 文件夹, 反编译后的所有文件都将被放到里面。
说明:
与 jadx 不同,apktool 反编译 apk 后,你在反编译后的 AndroidManifest.xml 里是找不到 versionCode 内部版本号 和 versionName 版本名称 的,因为 apktool 把它放到了 apktool.yml 文件里,如果你要修改 versionCode 、versionName ,可以在 apktool.yml 文件里修改。
假如你修改了 test 文件夹里的代码 或者 修改了 versionCode 、versionName 等其他内容,可用下面的命令将 test 文件夹编译为 apk 。
java -jar apktool_2.9.1.jar b test -o test.apk
该命令将 test 文件夹编译为 test.apk 。
到这里你已经得到了一个修改后的 apk,但是这个编译后的 apk 还无法安装到手机上,因为修改了文件,在安装时手机会对安装包里的签名进行比对签名,如果签名对不上说明apk被篡改了,就不会进行安装。
所以,如果现在要对修改后的 apk 重新进行签名,才能安装。
关于 apk 签名的具体细节说明,可参考这篇文章:Android apk之v1、v2、v3签名
使用如下命令生成 keystore 格式的密钥库:
keytool -genkey -alias new.keystore -keyalg RSA -validity 20000 -keystore new.keystore
输入两次密钥口令,一直回车,最后输入y
使用如下命令进行签名:
jarsigner -verbose -keystore new.keystore -signedjar D:\fanbiany\sign1.apk D:\fanbiany\test.apk new.keystore
说明:
该命令使用上面生成的 new.keystore 密钥库对 D:\fanbiany\test.apk 进行签名,最后生成 D:\fanbiany\sign1.apk
先找到你的 apksigner.jar 所在路径,我的是在C:\Users\kingdee\AppData\Local\Android\Sdk\build-tools\33.0.2\lib\apksigner.jar
执行如下命令进行 v2 签名:
java -jar C:\Users\kingdee\AppData\Local\Android\Sdk\build-tools\33.0.2\lib\apksigner.jar sign --ks new.keystore --out sign2.apk sign1.apk
说明:
使用 apksigner.jar 然后用 new.keystore 密钥库对 sign1.apk进行签名,最后生成 sign2.apk
一般 apk 都会进行加固,即对 Dex 加密,Dex 就是格式的文件里是 apk 的代码,加密后反编译是看不到项目主要代码的,从而保证了 apk 的安全性。
关于 Dex 加解密原理,可参考如下文章查看细节:
性能优化专题七–Apk加固之Dex文件的加密与解密
Dex 加解密与多 Dex 加载
APK 加固之 Dex 加解密,反编译都看不到项目主要代码。
本文参考:
Android 逆向入门保姆级教程
静态分析android程序之阅读smali代码
为什么有些APK解包后没有DEX文件?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。