1. 程式人生 > >APK反編譯二次打包工具和方法

APK反編譯二次打包工具和方法

文章前言:

對於反編譯如果沒有比較好的Android基礎同時也沒付諸實踐和學習的話,實質上也不能從反編譯的一堆程式碼檔案中,得到有價值的資訊。

例如程式碼都Android打包成dex檔案,通過這個檔案復原出來問題不大,但大部分的情況是復原後的Java檔案,基本上不能保證再編譯通過,

但出於技術學習的目的,某些程式碼片段已包含足夠的資訊,

反編譯工具及使用方法:

第一種 :dex2jar和JD-GUI和AXMLPrinter2工具 

步驟: 
1.首先找到Android軟體安裝包中的classes.dex 
把.apk檔案改名為.zip,然後解壓縮,得到其中的classes.dex檔案,它就是java檔案編譯再通過dx工具打包成的,所以現在我們就用上述

提到的2個工具來逆方向匯出java原始檔 

2.處理xml檔案

這時就用到了一個android4meAXMLPrinter2工具。我們先把檔案解析出來,首先cmd進入命令介面,然後進入到該jar包的目錄。此處

將解析的檔案和工具放在同一個檔案路徑

輸入的命令為:

java -jarAXMLpRinter2.jar AndroidManifest.xml(檢視解析之後的xml檔案)

java -jarAXMLPrinter2.jar  AndroidManifest.xml >  main.xml(將解析後的檔案方法main.xml檔案裡)

雙擊開啟main.xml檔案你就發現xml檔案已經可以正常查看了

3.把classes.dex拷貝到dex2jar.bat所在目錄。 
在命令列模式下定位到dex2jar.bat所在目錄,執行 dex2jar.bat classes.dex ,生成classes.dex.dex2jar.jar 


4.執行JD-GUI工具(它是綠色無須安裝的) 
開啟上面的jar檔案,即可看到原始碼 。實際上 這種只能看到程式碼而不能看到圖片 並且內容相差太多 恢復不了原來的程式碼 思路還是有的 

其它檔案就看不到了 
第二種 :apktool工具

apktool可以幫助我們把APK反編譯,生成程式的原始碼和圖片、XML配置、語言資源等檔案。我們對圖片和語言資源等檔案修改後,

可以再把它們編譯打包成APK,簽名後就是手機可以安裝的本地化/修正版APK了。 下載apktool-1.0.0.tar.bz2和apktool-install-windows-

2.1_r01-1.zip兩個包都要下。下載後解開,為了方便使用,按作者的推薦把得到的4個檔案複製到C:\Windows資料夾裡。 這個工具

是Java寫的,需要你的電腦安裝了JRE或者JDK,並在系統環境變數Path里加入java.exe所在路徑。 

以上準備工作做好後,就可以用它來反編譯APK了。假設***.apk放在C盤根目錄。輸入cmd,回車。 apktool d "C:\***.apk" "C:\***" 

複製程式碼(命令列解釋:apktool d 要反編譯的檔案輸出資料夾)這樣,***.apk就被反編譯了,輸出內容在C:\L***資料夾裡。開啟

C:\***資料夾,我們發現裡面有一些XML檔案和一些資料夾。絕大部分情況下,語言和圖片資源都在res資料夾裡。開啟res資料夾,

可以其中又是很多資料夾,絕大部分情況下,語言資源都放在values*資料夾裡。比如說values放預設語言(英語居多),values-de

放德語,values-fr放法語,values-zh-rCN(簡體中文)和values-zh-rTW繁體中文)

Win+R 執行CMD
E:<回車>
E:\>apktool d ***.apk ***<回車>
I: Baksmaling…
I: Decoding resource table…
I: Decoding resources…
I: Copying assets and libs…
現在檔案被decode到E:\***

修改好後CMD輸入
E:\>apktool b ***
I: Checking whether sources has changed…
I: Smaling…
I: Checking whether resources has changed…
I: Building resources…
I: Building apk file…
用Auto-sign簽名E:\***\dist\out.apk安裝

第三種 :ApkIDE工具

1.啟動程式:
雙擊ApkIDE.exe啟動程式。如果是XP系統啟動不了它,請安裝.Net Framework 2.0: http://download.microsoft.com/download/5/6/7/567758a3-7

59e-473e-bf8f-52154438565a/dotnetfx.exe

2.配置JDK:
第一次啟動時,軟體會自動查詢系統中的Jre安裝目錄,如果沒有找到會提示你配置SDK,可以點選選單[工具]-[配置SDK]對JDK進行配置。JDK的

安裝路徑必須配置(如果不配置,則無法進行修改操作),Android SDK則隨意(有些功能需要用到它,比如ddms等,但這些功能都無關修改工作)。

提示:從apk改之理2.4開始必須使用jdk,不再支援jre(jdk是開發工具,jre只是一般普通使用者執行java程式的工具)。

3.開啟要修改的Apk檔案:
單擊選單[專案]-[開啟Apk]選擇要修改的Apk檔案(注:檔名稱必須只有字母、數字、下劃線、空格、點號等組成,不能包含中文或其它亞洲字元)。

4.新的修改還是繼續舊的工作:
在開啟Apk檔案時Apk改之理會先對其進行基本的解析(包括它的名稱、包、許可權等),然後根據該apk應用的包名生成它的同名工作目錄,如果這個

工作目錄已經存在,Apk改之理會詢問是否要重新反編譯Apk。這裡要注意,已有的工作目錄通常是你以前修改這個Apk應用時所生成的工作目錄,

如果你要繼續這個修改操作,則單擊[否]繼續使用它,否則就重新反編譯得到一個全新的原始碼。

提示:如果你想繼續舊工作但卻誤點了“是”按鈕,也不用擔心,刪除的目錄被扔進了系統垃圾箱,你可以直接去系統回收站恢復。恢復時注意,如果

你之前成功對這個應用進行過dex2jar操作(由軟體在反編譯apk時自動進行,但可能會因一些原因而失敗),那麼回收站中會看到二個同名的目錄,

選中它們右鍵恢復即可。(注:這個特性Apk改之理2.1或更高版本中有效)

5.修改Apk
現在你可以使用軟體的搜尋、替換等功能來對原始碼進行修改,這種修改包括漢化、去廣告、改名、替換資源、圖片、xx等等。下圖中各個圖示按鈕

都有提示文字,可以將滑鼠懸浮在按鈕上顯示文字提示。具體的各項說明會單獨寫個文章來詳細解釋。

提示:這裡先提示一些沒有說明的小功能:

(1)在檔案樹上,或搜尋後得到的檔案列表上,按住Shift鍵+單擊滑鼠右鍵會直接顯示作業系統選單。 

(2)在“輸入輸出面板組”的搜尋結果面板中,搜尋結果列表以標籤的形式各自分開,滑鼠懸浮在標籤上會顯示對應搜尋結果的搜尋條件。

(3)工作目錄下的第一個build目錄下的檔案不會被搜尋(因為這個是Apktool編譯時用到的,與我們的修改無直接關係)。

6.編譯成Apk:
修改完成後單擊選單[編譯]-[編譯生成Apk]重新將原始碼打包成apk檔案,新生成的apk存放在原apk的同級目錄下,其名稱以“ApkIDE_”開頭。

7.獲取生成的Apk:
單擊選單 [編譯]-[獲取生成的APK] 可以直接在資源瀏覽器中定位到apk所在的目錄。

8.直接測試Apk:
這個需要用到選單[ADB]下的選單命令,如果你已經將裝置連線到電腦,或者直接在電腦上打開了安卓模擬器,可以單擊選單 [ADB]-[安裝生成的APK] 

直接向裝置或模擬器安裝修改生成的apk,然後再可以使用adb logcat 來觀察其執行狀況。如果發現ADB相關命令不啟作用,你可以先用 adb devices 

命令檢視裝置是否連線成功(可以直接在輸入輸出面板組的命令視窗輸入“adb devices”),也可以使用選單 [工具]-[Dalvik Debug MonitorService]

(ddms)來測試,當然這些都是後話了,也超出了本文的範疇。

第四種 :Smali2Java工具

第五種 :Androidfby工具

第六種 :UOT廚房

修改介面、美化圖示最簡單辦法,UOT廚房使用教程【已增加視窗動畫部分】

第七種 :APK打包解包工具(手機端工具)

(打包、解包、編輯、簽名的集合)

開啟介面以後。就可以選擇路徑進行解包了。解包完以後,會生成一個Apkpackge資料夾解包後的檔案就在裡面。(主要是解包以後替換裡面的

資源。如png、)如果要用該工具進行修改APK內的檔案(DEX),就選擇APK打包。打包有2個選項,1個是打包。一個是編輯。最後一個就是

簽名了。可以算是合集功能了。該軟體不能編輯SO檔案。

第八種 :Android萌化輔助工具

只是用批處理把幾個功能整合了下~方便使用~工具需要JRE支援,嗯,可以直接按4開啟官方下載頁面~裝過JDK的

可以不用了說解壓後執行Run.bat即可。

APK打包工具及使用方法:

第一種: apk-sign簽名apk檔案:

1. 下載檔案件附件apk-sign.rar,解壓到apk-sign資料夾;

2.將XXX.apk檔案解壓到XXX資料夾,然後將XXX直接拖到apk-sign檔案中的sign_pack.bat批處理檔案上以執行,彈出cmd執行視窗,等待執行完即可;

3.生成新資料夾XXX_signed中的apk檔案即為已簽名;

第二種:keytool.exe和jarsigner.exe工具

利用標準的java工具keytool.exe(位於jdk\jre\bin目錄下)建立key,利用jarsigner.exe工具使用生成的key來生成證書和給程式簽名(位於jdk\bin目錄下)。

Win +R 執行cmd,進入目錄D:\temp(注:使用該目錄為示例工作目錄)
1.建立可以,執行如下命令:
 keytool -genkey -alias demo.keystore -keyalg RSA -validity 20000-keystore demo.keystore
說明:(keytool工具是Java JDK自帶的證書工具)

-genkey引數表示:要生成一個證書(版權、身份識別的安全證書)
-alias引數表示:證書有別名,-aliasdemo.keystore表示證書別名為:demo
-keyalg RSA表示加密型別,RSA表示需要加密,以防止別人盜取
-validity 20000表示有效時間20000天( K3
-keystore demo.keystore表示要生成的證書名稱為demo
2.刪除之前的簽名檔案
用解壓縮工具解開啟apk檔案(如:更改a.apk 為a.zip,便可用壓縮工具開啟,並找到下面的目錄META-INF下的 CERT.RSA和CERT.SF檔案,並刪除

該檔案。刪除後,再次更改字尾名為.apk ;

說明:META-INF目錄:存放簽名後的CERT和MANIFEST檔案,用於識別軟體的簽名及版權。
Rres目錄:存放各種Android原始資源,包括:動畫anim、圖片drawable、佈局layout、menu選單、xml等等
AndroidManifest.xml編碼後的Android專案描述檔案,包括了Android專案的名稱、版本、許可權、程式元件描述等等
aclasses.dex編譯後Class被dx程式轉換成Dalvik虛擬機器的可執行位元組碼檔案
qresources.arsc所有文字資源的編譯產物,裡面包含了各Location對應的字串資源。
3.使用生成的key對apk簽名,執行如下命令:
 jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apkdemo.apk demo.keystore

說明:jarsigner是Java的簽名工具
-verbose引數表示:顯示出簽名詳細資訊
-keystore表示:使用當前目錄中的demo.keystore簽名證書檔案。
-signedjar demor_signed.apk demo.apk demo.keystore 正式簽名,三個引數中依次為簽名後產生的檔案demo_signed,要簽名的檔案demo.apk和

金鑰庫demo.keystore.
(注:檢視某個apk是否經過了簽名方法,jarsigner –verify demo.apk。優化:簽名後需要做對齊優化處理zipalign -v 4 your_project_name-unaligned.apkyour_project_name.apk ) 

將apk檔案複製到signapk.jar的同文件夾裡,執行java –jar signapk.jar platform.x509.pemplatform.pk8 test.apk test_new.apk


修改程式碼除錯方法:

1. 利用圖片的名稱apk破解後的資原始檔進行整體搜尋。利用Apktool可以得到一堆資原始檔。然後CopyEclipse的某個工程中。進行搜尋,最最有效率的

     方式(還記得快捷鍵吧Ctr+H)

2. 利用R.java檔案中的id,將得到的原始檔進行搜尋.這個時候,基本上所使用的元素的位置基本上清楚了。

3. 當無法定位Activity對應的Layout在哪裡時,這個時候需要用到hierarchyViewer去檢視佈局。【Android佈局學習工具. /android-sdk-windows/tools目錄下的       hierarchyviewer.bat, 是一款研究別人佈局的好工具.先開啟這個工具,然後啟動模擬器。發現驚喜.可以參考這篇文章獲得更多的理解。《

   結合12的資訊做交叉理解。(很有必要提及的問題,hierarchyViewer裡面涉及的佈局,並非跟Layoutxml完全一致hierarchyViewer中,很容易看到GridView

   中居然可以包含一個LinearLayout,這個實際上在XML中,是不允許這樣描述的。一般Android是在原始碼中實現一個GridView包含一個LinearLayout,這個時候,

   不得不利用到上文12描述的方法交叉定位)。

另附各類安卓反編譯軟體下載地址如下: