安卓apk反编译、修改、从新打包、签名全过程

首先明确,反编译别人apk是一件不厚道的事情。代码是程序员辛苦工做的成果,想经过这种手段坐享其成,是不对的。这也说明,代码指鹿为马常重要的。本文抱着学习的态度,研究在一些特殊的状况下若是有须要,该怎么反编译apk。html

工具简介

apktool,编译和反编译apk,从apk中提取图片和布局资源android

dex2jar,将可运行文件classes.dex反编译为jar源码文件git

jd-gui,查看jar源码文件程序员

反编译

apktool安装

Windows系统: 
1. 首先确保系统安装有Java 
2. 下载apktool.bat脚本 
3. 下载最新版本的apktool.jar,而且重命名为apktool.jar 
4. 将apktool.bat和apktool.jar放在同一目录下,就能够在命令行窗口使用了。 
5. 其余系统请参考连接github

用法

能够直接在命令行执行apktool.bat查看帮助。这里介绍两个最经常使用的:算法

反编译

apktool.bat d -o <output_dir> test.apk

其中<output_dir>指定输出目录,默认为apk.out。windows

编译

apktool.bat b -o <output.apk> <input_dir>

其中<input_dir>就是上面反编译输出的目录,<ouput.apk>是编译的输出结果,默认为dist/<name>.apk。工具

示例

一个典型的apktool反编译的结果以下:布局

这里写图片描述

此时,能够查看AndroidManifest.xml,res及smali文件了。甚至能够修改这个目录下的资源文件或者smali文件,而后从新编译。学习

值得注意的是,apktool反编译出来只能获得apk的smali文件,即汇编语言版本,并不能获得源代码。

查看源码

一. 这里须要用到另外两个工具,下载dex2jar并解压。下载jd-gui,这是一个带UI的应用程序。

二. 将须要反编译的apk的后缀名改成.zip或者.rar,而后解压到一个文件夹,获得其中的classes.dex文件。

这里写图片描述

三. 将classes.dex复制到解压后的dex2jar-2.0文件夹下。从命令行进入到该目录,执行

d2j-dex2jar.bat classes.dex

会生成由classes.dex反编译获得的jar文件,classes-dex2jar.jar。

这里写图片描述

四. 而后使用jd-gui打开classes-dex2jar.jar,就能够查看源码了。

这里写图片描述

若是apk在发布的时候加过混淆处理,那么咱们也只能获得混淆后的版本。想经过阅读源码来破解别人的apk,仍是有一些难度的。

修改代码

若是只是修改apk相应的资源,例如图片,比较好办,在res文件夹下找到相应的文件替换就能够。

修改代码比较麻烦,由于反编译出来的结果中只有smali文件,即Java虚拟机支持的汇编语言。

若是确实须要修改代码,就得对照smali文件和从classes.dex反编译出来的源码了,按照smali的规范来改动便可。至关于写汇编,这个难度比较大。

从新打包

使用apktool编译前面反编译生成的目录便可。

签名

签名是对要发布的apk文件做标记,确保你的apk文件有惟一的身份归属认证,只有相同签名和相同包名的文件才能够覆盖安装并保留用户信息。

对于反编译的apk,咱们能够经过jarsigner来对它进行签名。

生成keystore文件

首先,签名须要keystore文件,可使用keytool工具生成,通常Java环境都带有keytool命令,能够在命令行测试。

keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore

各个参数解释以下:

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

输入上述命令后,会有以下的提示:

输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
  [Unknown]:  test
您的组织单位名称是什么?
  [Unknown]:  test
您的组织名称是什么?
  [Unknown]:
您所在的城市或区域名称是什么?
  [Unknown]:
您所在的州或省份名称是什么?
  [Unknown]:
该单位的两字母国家代码是什么
  [Unknown]:
CN=test, OU=test, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗?
  [否]:  y


输入<demo.keystore>的主密码
        (若是和 keystore 密码相同,按回车):

签名apk

jarsigner也存在于Java JDK的安装包当中,因此安装好了Java环境的话,能够直接在命令行使用。

jarsigner -verbose -keystore demo.keystore demo.apk demo.keystore

-verbose 指定生成详细输出 
-keystore 指定数字证书存储路径

对于Android Studio生成的jks文件

jarsigner -digestalg SHA1 -sigalg SHA1withRSA(或SHA1withDSA) -verbose -keystore xxx.jks -signedjar xxx.apk(签名后的apk名字) xxx.apk(须要签名的apk) xxx(keystore别名)

例如:

jarsigner -digestalg SHA1 -sigalg SHA1withRSA -verbose -keystore ttl.jks -signedjar dest1.apk dest.apk CP

也能够增长storepass参数,来设置密码口令.这样就不用手动敲了

-storepass xxxxx
 

这样,就完成了对一个apk的签名过程,而后就能够安装使用了。注意若是你的手机上原来就有这个apk,须要卸载掉。由于新apk的签名已经改变了。

参考

apktool

dex2jar

jd-gui

Android开发学习总结(六)—— APK反编译

android apk反编译、修改源码、从新打包全过程

相关文章
相关标签/搜索