apk 反編譯大家都比較熟悉,這里只做一個筆記。
1 反編譯 apk
apktool d perfect.apk
這樣就把資源文件解壓縮了, classes.dex 也反編譯成了 smali 文件
2 修改 smali 文件
得到 smali 文件,現在就可以對 smali 文件進行修改和添加自己的代碼了。
當然可以進一步用 dex2jar (或者 enjarify) 處理將 dex 轉成 java class 文件, 再用 jd-jui 等反編譯成 java 代碼。
現在 apk 基本都做了混淆, 但仔細讀還是基本能夠明白意思的。
修改 smali 是考驗你 smali 匯編的基礎, 這個就是孰能生巧,多讀多練了, 比 arm 匯編要簡單多了。
3 重新打包
apktool b perfect
4 重簽名
重新打包后沒有簽名信息, 還需要重新簽名,因為 apk 沒有簽名是不能安裝的。
有2種簽名方法一是通過 jarsigner , jarsigner 和 keytool 其實都是 jdk 中的工具, 在 java 安裝目錄下可找到, 本來就是給 jar 文件簽名的
jarsigner -verbose -keystore leslie.keystore -storepass 123456 -keypass 123456 -signedjar perfect-hack-signed.apk perfect-hack.apk lesliekeystore
也可以用默認的 debug key 簽名, debug.keystore 一般位於 ~/.android 目錄下
jarsigner -verbose -keystore debug.keystore -storepass android -keypass android -signedjar perfect_signed.apk perfect.apk androiddebugkey
如果沒有 keystore 可以用 keytool 生成一個
另外一種簽名方式是通過 signapk.jar 對 apk 進行簽名
java -jar signapk.jar .testkey.x509.pem testkey.pk8 my.apk my_signed.apk
這是基礎中的基礎了,看着很簡單,但自己第一次在 smali 中成功注入一行彈 toast 的代碼還是用了一天的時間。
對一個已經簽名的 apk 重新進行簽名
第一步刪除原來的簽名文件
zip -d foo.apk META-INF/\*
第二步重新簽名
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore leslie.keystore -storepass 123456 -keypass 123456 -signedjar wing_signed.apk wing.apk lesliekeystore
keystore 文件和 .pem .pk8 是可以相互轉化的
