詳解android應用程式的反編譯
畢業設計不小心選了智能手機開發方向,而平台選擇了 android,所以最近自學了不少android程式開發的知識。但是作為一個懶散不堪,容易半途而廢的人,android所內建的體系還是有點龐大, 想要以此開發一個屬於自己的獨一無二的應用,難度對我這個小菜鳥來說實在大。所以難免生起“他山之石,可以攻玉”的想法。
畢設帶隊的老師說:代碼都自己寫的程式員不是好程式員。利用別人的代碼,從中再修改一番變成自己的,這才是好的程式員。我不知道這話有沒有道理,反正是說到了我的心坎了。懶人自有懶人的活法,天才是少數的,而懶惰的人是多數的。自然,我是多數人。
但是要修改別人的代碼必須曉得他的代碼,所以我們需要對android應用程式進行反編譯。所幸andorid是個開放的平台,反編譯比通常程式簡單的多,下面就說說這個簡單的過程。
基礎知識
android 上安裝的應用程式尾碼都是apk(Android application package),每個要安裝到android平台的應用都要被編譯打包為一個單獨的檔案,尾碼名為.apk。而實際上這個apk格式的檔案是一種變相的 zip壓縮包,你可以使用winrar開啟看到裡面的檔案的結構。通常你可以看到這些內容:
|– AndroidManifest.xml
|– META-INF
| |– CERT.RSA
| |– CERT.SF
| |– MANIFEST.MF
|– classes.dex
|– res
| |– drawable
| | `– icon.png
| |– layout
| `– main.xml
|– resources.arsc
各個檔案內容涵義不贅述了,可以看這篇文章http://www.ophonesdn.com/article/show/38
我們通常需要反編譯出的有兩部分:classes.dex和main.xml。一個是java經過google自製虛擬機器dalvik編譯出的位元組碼,一個是布局檔案。大點的程式布局檔案不止一個,我們這裡只說只有一個的,其他類似。
需要的工具
1、把dex檔案反編譯為jar檔案的工具。(dex2jar)
2、把jar反編譯為java的工具。(JD-GUI)
3、AXMLPrinter2
三者下載連結分別是:
http://code.google.com/p/dex2jar/
http://java.decompiler.free.fr/?q=jdgui
http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.zip&can=2&q=(這個檔案貌似已經不可用,有興趣的童鞋可以去csdn下載)
XML檔案的反編譯
apk檔案中的xml檔案都是經過壓縮的,所以如果直接開啟會看到一些亂碼,所以需要工具AXMLPrinter2。
安裝完java環境,然後cmd進入你把apk檔案解壓到的檔案目錄內,使用命令(注意,AXMLPrinter2.jar檔案也要):
java -jar AXMLPrinter2.jar main.xml
成功後會在cmd裡出現xml反編譯出的檔案
classes.dex檔案反編譯
Android 模擬器中提供了一個dex檔案的反編譯工具,dexdump。用法為首先啟動Android模擬器, 把要查看的dex檔案用adb push上傳的模擬器中,然後通過adb shell登入,找到要查看的dex檔案,執行dexdump xxx.dex。但是這樣得到的結果,其可讀性是極差的。
所以我們使用了兩個工具dex2jar和JD-GUI。
反編譯的步驟:
1、從APK中提取classes.dex檔案,對APK檔案解壓即可得到。 將其放到dex2jar的目錄下,開啟cmd,運行dex2jar.bat classes.dex,產生classes.dex.dex2jar.jar。
2、運行JD-GUI工具,開啟上面的jar檔案,即可看到原始碼。
在JD-GUI上可以看到一堆a b c d ……的樹形結構,這些都不是,真正要看的是activity。