1. 程式人生 > >Android反編譯後重新打包

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