有很多帖子對(duì)這種技術(shù)作了詳解,我也一步一步來實(shí)現(xiàn)一下,做個(gè)記錄。
三個(gè)工具:
Apktool,dex2jar,JD-GUI
1、Apktool

(1) 右鍵wrapper script另存為apktool,文件不帶后綴名;
(2) 根據(jù)鏈接下載最新的apktool-2文件;
(3) 將下載的apktool-2的jar文件命名為apktool.jar;
(4) 將apktool.jar和apktool放在/usr/local/bin目錄下;
(5) 執(zhí)行chmod a+x apktool、chmod a+x apktool.jar給這兩個(gè)文件添加可執(zhí)行權(quán)限;
(6) 運(yùn)行apktool命令,出現(xiàn)下面的結(jié)果證明安裝成功:


進(jìn)入dex2jar-2.0文件夾,執(zhí)行chmod a+x d2j_invoke.sh、chmod a+x d2j-dex2jar.sh給這兩個(gè)文件添加可執(zhí)行權(quán)限。
3、使用 apktool 反編譯 apk:apktool d *.apk

反編譯之后的文件夾如下:

original/META-INF/CERT.RSA就是apk的簽名文件。
4、使用 dex2jar 將 dex 轉(zhuǎn)為 jar 文件:
進(jìn)入dex2jar-2.0文件夾,執(zhí)行./d2j-dex2jar.sh *.apk:

可以看到dex2jar-2.0文件夾下多了轉(zhuǎn)換后的jar文件:

5、使用 JD-GUI 查看jar文件:


6、將apk安裝到手機(jī)上,打開某個(gè)界面,然后執(zhí)行adb shell dumpsys activity activities查看當(dāng)前Activity的路徑和名稱,在 JD-GUI 中找到對(duì)應(yīng)的文件,如果有想要修改的地方,找到要修改的位置,然后在相應(yīng)的smali文件中定位到對(duì)應(yīng)的地方進(jìn)行修改,然后保存。
7、使用 apktool 回編譯 apk:apktool b *(*即為反編譯出的文件夾)


build 和 dist 文件夾是在回編譯的時(shí)候產(chǎn)生的,dist/my.apk 就是回編譯出來的apk。
直接解壓或者反編譯 dist/my.apk 文件會(huì)發(fā)現(xiàn),沒有 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 提供一個(gè)時(shí)間戳。

一大串信息之后,

再看指定路徑下的文件,出現(xiàn)了指定名字的簽名后的apk文件:

9、簽名后的回編譯的apk可以成功安裝(adb install *.apk)并運(yùn)行:

查看簽名(keytool -printcert -file META-INF/MYKEY.RSA):

已經(jīng)是自己的簽名信息了。
參考:
MAC上反編譯android apk---apktool, dex2jar, jd-jui安裝使用(含手動(dòng)簽名)
對(duì)某日頭條apk 的反編譯和二次打包