Android反編譯後重新打包
在android開發中經常會遇到需要反編譯競品的需求,題主也就針對反編譯apk後替換sdk後重新打包的場景進行試驗,下面一步一步來說明Android如何反編譯後重新打包。
一個典型apk包中包含的內容
我們知道android專案編譯成應用程式後的安裝檔案是.apk檔案,執行期間classloader載入的是dex檔案中的class。所以我們先來看看一個典型的apk包中具有哪些基本內容:
apk包內容.png
方式一:使用apktool直接反編譯apk(酷市場為例,2016.8.12更新)
配置apktool環境:
1.開啟apktool官網
2.下載執行指令碼檔案和apktool.jar包
先下載指令碼檔案 :
mac os 對應 apktool.sh
windows 對應 apktool.bat
再下載最新的apktool.jar
3.配置apktool的執行環境
windows:把下載的兩個檔案都copy到c:/windows目錄,或者放到自己指定的目錄下再修改系統path也行
Mac os: 把下載的兩個檔案都copy到/usr/local/bin目錄下,修改許可權為可執行chmod a+x
在命令列終端模式下,輸入apktool驗證是否完成apktool環境配置
反編譯apk包
1.命令列進入到apk包所在的資料夾路徑
2.執行反編譯命令 apktool d filename
3.得到反編譯後的資料夾
4.修改apk內容(舉例替換logo)
檢視manifest.xml檔案,icon對應的就是配置應用logo
logo圖片資源所在
5.重新簽名打包
1.回編譯apkapktool b files
files就是對應剛剛修改的apk資料夾,執行完後會重新生成一個apk檔案
注意:編譯後的apk是安裝不成功的,總是提示
Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]
,實質是沒簽名。
2.生成簽名:keytool -genkey -keystore coolapk.keystore -keyalg RSA -validity 10000 -alias coolapk
注意:上面-keystore後面跟的是簽名檔案的名字,而-alias是別名,一般情況下-keystore後面跟-alias是一樣的,但其實兩者沒有關係,這也是我故意搞成不一樣的原因。
3.為apk增加簽名:jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa -verbose -keystore coolapk.keystore -signedjar coolapk-signed.apk coolapk.apk coolapk
注意:
1.最後的”coolapk”就是-alias後面帶的,必須保持一致
2.如果不帶-digestalg SHA1 -sigalg MD5withRSA簽名後的apk安裝也會不成功,INSTALL_PARSE_FAILED_NO_CERTIFICATES的錯誤,如果不帶-tsa會報一個時間方面的警告.
方式二:使用dex2jar反編譯檢視java程式碼(為例,2016.4月更新)
下載dex2jar和jd-gui
dex2jar: https://github.com/pxb1988/dex2jar
jd-gui: http://jd.benow.ca/
使用dex2jar將從apk中解壓得到的dex檔案轉成jar包
使用jd-gui來檢視jar包內容
jd-gui.png
將要需改的類更改程式碼後複製到jar內,完成覆蓋替換
覆蓋替換類
把jar包重新轉成dex檔案
將修改完成後的dex檔案複製到原來的apk檔案中
直接覆蓋原來的dex檔案
補充:
Smali2JavaUI
對於博主說得,先dex2jar把classes.dex轉為jar,再jd-gui把jar轉為原始碼*.java檔案。
現在可以用Smali2JavaUI這個軟體,一部到位。可以把這兩個步驟化為一個步驟。所以,如果只想反編譯看*.java檔案的話,只用Smali2JavaUI軟體就可以了。
這個軟體可以直接開啟***.apk檔案,然後就直接看到*.java檔案了。
Smali2JavaUI最新版本下載連結http://www.hensence.com/cn/smali2java/#Download
---------------------
作者:吾ha
來源:CSDN
原文:https://blog.csdn.net/ysc123shift/article/details/52985435
版權宣告:本文為博主原創文章,轉載請附上博文連結!
然後就興沖沖地直接去安裝了,然而~
看來果然沒這麼簡單就能呢個搞定,繼續排查原因。
找原因
看看apk檔案中有什麼可疑物件導致了安裝失敗,果然除了dex和資原始檔以外,還發現了三個檔案
原來是apk包本身的防篡改機制導致的
開啟檔案來一探究竟,果然裡面都是對打包時對檔案進行了標識記錄,看來這是避免檔案被篡改的安全機制。
Paste_Image.png
找到問題原因就來解決,嘿咻嘿咻
想想既然是這些檔案導致的,那先試試簡單粗暴地直接把檔案刪了,避免防篡改檢查
Paste_Image.png
然而,這樣的是不行的,必須要有這個資料夾才能解析apk包,可能這些相當於是讀取安裝檔案列表清單,必須具有,看來此路不通,
Paste_Image.png
既然原來的清單內容對不上,但又不能不提供,那能不能我們給它配一個新的?
想到這裡,感覺可以動手試試,嘿咻嘿咻~
這些檔案既然是在編譯打包成apk時期自動生成的,那要想再生成一份新的,所以應該重新打包就可以。可是這個本身已經就是apk檔案了,怎麼再編譯打包?
停下來想了想,對啊,突然想起來可以給包籤個名唄,打簽名應該也會有同樣的效果才對,繼續嘿咻嘿咻。
找個工具來簽名吧,用自己的去簽名留下點什麼不良記錄就不好了,嘿嘿~
Paste_Image.png
簽名成功後
成功安裝,破解完成
補充:
1、生成keystore檔案
keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore,執行該命令會生成一個abc.keystore證書檔案。
2、對重打包之後的apk進行簽名
將dist目錄下的apk拷貝到d:\apktool目錄,執行下面命令
jarsigner -verbose -keystore abc.keystore -signedjar calendar_signed.apk calendar.apk abc.keystore
執行之後會發現,在當前目錄下生成一個calendar_signed.apk,該apk已經簽名了,就可以正常使用了。
---------------------
作者:dmfrm
來源:CSDN
原文:https://blog.csdn.net/u010889616/article/details/78198822
版權宣告:本文為博主原創文章,轉載請附上博文連結!
轉自:https://www.cnblogs.com/yanzheng216/articles/6378843.html