有很多帖子對這種技術作了詳解,我也一步一步來實現一下,做個記錄。
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 的反編譯和二次打包