1. 程式人生 > >APK反編譯之二:工具介紹

APK反編譯之二:工具介紹

www 權限 nap 一段時間 rmi 麻煩 -s HR 逆向

作者:lpohvbe | http://blog.csdn.net/lpohvbe/article/details/7983907

前面一節我們說過,修改APK最終是通過修改smali來實現的,所以我們接下來介紹的工具就是如何把APK中的smali文件獲取出來,當然同時也需要得到AndroidManifest.xml等文件。直接修改APK後綴為ZIP得到的xml文件是不能直接打開的,需要轉換一下格式才能查看和修改。橫觀所有的工具中,最最最強大的當然還是ApkTool,所以下面後重點介紹!OK,開始正題。

一、查看xml文件

如果只是簡單的需要查看xml中的內容(例如只是想看看AndroidManifest.xml中的配置信息、主啟動Activity、permission權限或布局文件等等),那麽可以使用AXMLPrinter2.jar這個工具。使用方法很簡單,例如想查看AndroidManifest.xml文件內容,為了方便,把AndroidManifest.xml和AXMLPrinter2.jar放到同一個目錄下,在cmd中定向到該目錄並輸入:

  1. java -jar AXMLPrinter2.jar AndroidManifest.xml > tmp.txt

則會在該目錄下創建一個tmp.txt文檔,內容就是解碼後的AndroidManifest.xml的內容。

這個方法有個缺點就是只能查看,不能修改後再轉換回原格式的xml文件,需要修改xml文件內容的,下面會有介紹。

二、查看java源代碼

直接解壓apk只得到Dalvik VM執行的classes.dex文件,要通過這個dex文件查看java源代碼的話,需要使用dex2jar和jd-gui這兩個工具。

我下載的是官方版本的dex2jar-0.0.9.9,解壓後可以看到一大堆的bat和shell腳本。不過我們只需要用到其中的d2j-dex2jar或dex2jar.bat(Windows下)。具體操作步驟是:

1、把需要反編譯的apk文件後綴改為zip,解壓後取出其中的classes.dex文件,為了方便還是放到dex2jar-0.0.9.9目錄下(和dex2jar.bat同一目錄);

2、打開cmd,定位到該目錄後輸入:

  1. d2j-dex2jar.bat classes.dex

幾秒後程序就會在該目錄下生成了一個classes-dex2jar.jar文件,這個jar文件就是原java代碼編譯後產生的文件;

3、打開jd-gui軟件,點擊左上角的“Open a file”按鈕並找到2步驟生成的classes-dex2jar.jar文件,找到你想查看的java文件,還原度還是挺高的。如果有需要把java代碼保存下來,點擊File-Save Sources或者Save All Sources把當前java文件或全部java文件保存起來。

註意的是,這些java代碼(基本上)不能直接重新編譯,因為可能存在代碼混淆,而且復雜一點的邏輯有時候還原不回來,顯示出很奇怪的代碼,所以這個軟件還不是很完善,但是用來參考原java代碼邏輯夠用了。

三、獲取和修改smali文件

獲取smali文件是反編譯的第一步,獲取的方法有兩種:

1、baksmali.jar和smali.jar

baksmali.jar用來把dex或odex文件解析為一個一個的smali文件,使用命令:

  1. java -jar baksmali.jar -x classes.dex

它會在目錄下生成一個文件夾(默認是out),裏面保存的就是這個dex中的smali文件,我們可以打開查看和修改,修改完畢後,使用smali.jar打包回dex文件:

  1. java -jar smali.jar out -o classes.dex

其中out就是剛才使用baksmali.jar創建的文件夾名字。

這樣修改後,直接放回zip中然後把後綴改為apk是不能直接安裝到機子上測試的,因為你修改了裏面的文件,還需要使用簽名工具進行重新簽名(稍後介紹)。

2、ApkTool——目前最強大的反編譯工具

以上所有工作,除了查看java源代碼,其實有一個工具可以幫你輕松做到,那就是由一個外國開發者制作的ApkTool.jar工具。它可以反編譯apk中的資源文件、解碼xml文件、生成smali文件,還能把修改後的工程逆向生成apk文件。換言之,有了它可以拋棄AXMLPrinter2.jar、smali.jar和baksmali.jar了,使用也相當的方便。

(1)、反編譯apk得到smali和資源文件

例如要反編譯的apk為zheshiyige.apk,那麽把該apk與ApkTool放到同一目錄,cmd執行:

  1. java -jar apktool.jar d zheshiyige.apk APKFiles

等待一段時間後(視乎apk文件大小),可以看到該目錄下生成了一個APKFiles文件夾,裏面就是我們需要的解碼後的資源文件、xml文件和smali文件等。xml文件不需要再使用AXMLPrinter2.jar來解碼即可直接查看。

(2)、回編譯成apk文件

對反編譯得到的文件進行修改後把它回編譯也是很簡單的:

  1. java -jar apktool.jar b APKFiles

同樣等待一段時間後,如果修改正確沒有錯誤的話,回編譯產生的apk將會在APKFiles下的dist文件夾中,當然它也是沒有重新簽名的,不能直接安裝使用。

四、對Apk進行簽名

關於簽名,可以有些童鞋會感到疑惑,下面先簡要提一提:

1、為什麽需要簽名?

(1)發送者的身份認證,由於開發商可能通過使用相同的PackageName來混淆替換已經安裝的程序,以此保證簽名不同的包不被替換;

(2)保證信息傳輸的完整性,簽名對於包中的每個文件進行處理,以此確保包中內容不被替換,防止交易中的抵賴發生,Market對軟件的要求。

2、簽名的一些說明

(1)所有的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序;

(2)Android程序包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證;

(3)如果要正式發布一個Android應用,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布;

(4)數字證書都是有有效期的,Android只是在應用程序安裝的時候才會檢查證書的有效期。如果程序已經安裝在系統中,即使證書過期也不會影響程序的正常功能;

(5)Android將數字證書用來標識應用程序的作者和在應用程序之間建立信任關系,而不是用來決定最終用戶可以安裝哪些應用程序;

(6)簽名後需使用zipalign優化程序。

3、如何簽名

簽名工具有不少,這裏僅提及其中的一個:signapk.jar。signapk.jar本來就是包含在android源碼包中的一個工具,用它可以把上面經過反編譯-回編譯後得到的apk進行簽名,由於直接使用signapk.jar進行簽名很麻煩,而且最終使用的是下面最後談及的綜合工具,所以這裏僅提及簽名流程:

(1)、使用OpenSSL生成公鑰/私鑰對;

(2)、使用signapk.jar和(1)的公私玥對對apk進行簽名。

這樣經過簽名後的apk才能安裝到設備上進行測試。

五、推薦一個網友制作的綜合工具:ApkTool + SignApk

程序員是最怕麻煩的,所以早就有網友用腳本把所有操作都幫我們整理好了,它其實就是幫我們做好了自動反編譯、自動回編譯和簽名的工作,不用再每一次都輸入大串的命令。需要下載的請點擊下面的鏈接,使用方式直接打開就知道,說明中已經說得很明白了。

技術分享圖片

==工具下載鏈接請戳我==

六、其他輔助工具

1、UltraFileSearch:這是個很!有!用!的軟件!UltraFileSearch 允許你指定多個文件掩碼和多驅動器和/或文件夾在同一時間,它能夠整理出的文件和文件夾根據自己的性質(如更新日期),找到其中包含某特定詞或句子的所有文件。

2、如果使用NotePad++修改smali文件,推薦使用一個語法高亮文件userDefineLang.xml,使用方法:放置到C:\Users\<用戶名>\AppData\Roaming\Notepad++下即可。

Reference:

Android apk 簽名: http://www.cnblogs.com/not-code/archive/2011/05/15/2047057.html

APK反編譯之二:工具介紹