最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。
准备工作
1. 系统配置好Java JDK环境变量
2. 需要root权限的手机(针对系统自带apk,其他软件免root)
3. Auto-Sign签名工具
4. apktool工具
开始反编译
本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:
按键win + R 输入cmd,打开命令窗口,并将路径切换到需要反编译的apk文件Settings.apk所在的路径,输入命令行
apktool d -r Settings.apk
即可在该目录下生成一个Settings文件夹,如图:
文件夹的变化如下图:
重新打包
此时反编译完成,我们可以打开Settings文件夹,在里面对应的文件夹中修改或是替换里面的内容如文字或图片等,替换称自己的即可(如果需要改代码,则可打开对应的smali文件,找到对应的地方,把对应的汇编语言修改成自己的中文即可,因为这个是汇编语言,小编不会汇编,所以不敢误人子弟),替换完成之后,将路径切换到apktool下执行命令:
apktool.bat b -o <output.apk> <input_dir>
其中<output.apk>就是编译打包输出的新的apk文件如Settings_new.apk,而
<input_dir>
则是反编译得到的文件夹,如Settings,(注意这两个地方实际是文件所在路径,因为小编这个是在apktool的目录下直接操作的,故这样写,如果不在该根目录下的则需要替换成路径,且接下来的命令也要切换到apktool.bat所在的根目录下执行),如小编现在执行命令:
apktool.bat b -o Settings_new.apk Settings
执行完该命令之后会在该路径下生成一个Settings_new.apk文件,此文件就是新打包得到的apk文件,如图:
签名
签名的方式在这里我介绍两种方式:
方式一:
将编译打包新生成的Settings_new.apk文件复制到auto-sign的根目录下,然后将路径切换到auto-sign根目录并执行命令:
java -jar signapk.jar testkey.x509.pem testkey.pk8 Settings_new.apk Settings.apk
在auto-sign根目录下会生成一个Settings.apk文件,如图所示:
接下来则可将该文件夹替换掉刷机包里面原来的那个即可。
方式二:
(1) 生成keystore文,首先,签名需要keystore文件,可以使用keytool工具生成,一般Java环境都带有keytool命令,可以在命令行测试。在任意路径下执行命令(小编还是在apktool根目录下):
keytool -genkey -alias settings.keystore -keyalg RSA -validity 40000 -keystore settings.keystore
命令执行完之后会在该目录下生成一个settings.keystore文件
各个参数解释如下:
-genkey 产生证书文件
-alias 产生别名
-keystore 指定密钥库的.keystore文件中
-keyalg 指定密钥的算法,这里指定为RSA(非对称密钥算法)
-validity 为证书有效天数,这里我们写的是40000天
(2)开始签名
输入并执行以下命令则可进行签名:
jarsigner -verbose -keystore settings.keystore Settings_new.apk settings.keystore
-verbose 指定生成详细输出
-keystore 指定数字证书存储路径
如下如所示
待签名命令执行完成之后,则签名完成,此时的Settings_new.apk就是签名过的,然后将其重命名之后复制替换系统刷机包原来的即可。
至此,整个流程已经完成了。
查看源码
如果我们想看某个app里面的某个东西具体实现的代码,我们可以反编译进行查看他的源码,不过大多数的app都是经过混淆、加固的,反编译出来的可能代码已经变得面目全非了,但是我们还是要掌握这个过程。
需要用到两个工具 dex2jar和 jadx-gui(用于代码查看),这两个工具都在apktool压缩包中。
(1)将需要反编译的 app文件的后缀名.apk换成.rar,然后解压到一个文件夹中,在文件夹中得到一个classes.dex文件
(2)将classes.dex复制到解压后的dex2jar-0.0.9.15文件夹中,并在命令窗口中切换路径到该根目录下,并执行命令:
d2j-dex2jar.bat classes.dex
在该目录下生成由classes.dex反编译得到的jar文件,classes-dex2jar.jar,然后运行jadx-gui中bin下的jadx-gui.bat,打开classes-dex2jar.jar文件,即可查看源码,如图:
反编译并不是窃取人家的劳动成果,而是一个
资源共享、相互学习
的过
程。