有很多帖子对这种技术作了详解,我也一步一步来实现一下,做个记录。
1、Apktool
(1) 右键wrapper script
另存为apktool
,文件不带后缀名;
(2) 根据链接下载最新的apktool-2文件;
(3) 将下载的apktool-2的jar文件命名为apktool.jar
;
(4) 将apktool.jar
和apktool
放在/usr/local/bin
目录下;
(5) 执行chmod a+x apktool
、chmod a+x apktool.jar
给这两个文件添加可执行权限;
(6) 运行apktool
命令,出现下面的结果证明安装成功:
进入dex2jar-2.0文件夹,执行chmod a+x d2j_invoke.sh
、chmod a+x d2j-dex2jar.sh
给这两个文件添加可执行权限。
3、使用 apktool 反编译 apk:apktool d *.apk
反编译之后的文件夹如下:
original/META-INF/CERT.RSA
就是apk的签名文件。
4、使用 dex2jar 将 dex 转为 jar 文件:
进入dex2jar-2.0文件夹,执行./d2j-dex2jar.sh *.apk
:
可以看到dex2jar-2.0文件夹下多了转换后的jar文件:
5、使用 JD-GUI 查看jar文件:
6、将apk安装到手机上,打开某个界面,然后执行adb shell dumpsys activity activities
查看当前Activity的路径和名称,在 JD-GUI 中找到对应的文件,如果有想要修改的地方,找到要修改的位置,然后在相应的smali文件中定位到对应的地方进行修改,然后保存。
7、使用 apktool 回编译 apk:apktool b *
(*即为反编译出的文件夹)
build 和 dist 文件夹是在回编译的时候产生的,dist/my.apk 就是回编译出来的apk。
直接解压或者反编译 dist/my.apk 文件会发现,没有 META-INF 文件夹,也就是说目前 dist/my.apk 是没有签名的。
8、给回编译的apk签名:
jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa https://timestamp.geotrust.com/tsa -verbose -keystore mykey.keystore -signedjar my-singed.apk my.apk mykey
最后的 mykey 就是 mykey.keystore 的 alias ,-tsa 提供一个时间戳。
一大串信息之后,
再看指定路径下的文件,出现了指定名字的签名后的apk文件:
9、签名后的回编译的apk可以成功安装(adb install *.apk
)并运行:
查看签名(keytool -printcert -file META-INF/MYKEY.RSA
):
已经是自己的签名信息了。
参考:
MAC上反编译android apk---apktool, dex2jar, jd-jui安装使用(含手动签名)
对某日头条apk 的反编译和二次打包