Android的.apk檔案實際上就是一個zip檔案 可以直接用winrar開啟
如所示:
包括了一個META-INF目錄
一個res目錄
一個AndroidManifest.xml
一個classes.dex
AndroidManifest.xml是每個應用都必須定義和包含的,它描述了應用的名字、版本、許可權、引用的庫檔案等等資訊,如要把apk上傳到Google Market上,也要對這個xml做一些配置。
META-INF目錄
META-INF目錄下存放的是簽名資訊,用來保證apk包的完整性和系統的安全。在eclipse編譯產生一個apk包時,會對所有要打包的檔案做一個校正計算,並把計算結果放在META-INF目錄下。而在Android平台上安裝apk包時,應用管理器會按照同樣的演算法對包裡的檔案做校正,如果校正結果與META-INF下的內容不一致,系統就不會安裝這個apk。這就保證了apk包裡的檔案不能被隨意替換。比如拿到一個apk 包後,如果想要替換裡面的一幅圖片,一段代碼,或一段著作權資訊,想直接解壓縮、替換再重新打包,基本是不可能的。如此一來就給病毒感染和惡意修改增加了難度,有助於保護系 統的安全。
classes.dex檔案
classes.dex是java源碼編譯後產生的java位元組碼檔案。但由於Android使用的dalvik虛擬機器與標準的java虛擬機器是不相容 的,dex檔案與class檔案相比,不論是檔案結構還是opcode都不一樣。目前常見的java反編譯工具都不能處理dex檔案。
Android模擬器中提供了一個dex檔案的反編譯工具dexdump。用法為首先啟動Android模擬器,把要查看的dex檔案用adb push上傳的模擬器中,然後通過adb shell登入,找到要查看的dex檔案,執行dexdump xxx.dex。
目前在網上能找到的另一個dex檔案的反編譯工具是Dedexer。Dedexer可以讀取dex格式的檔案,產生一種類似於組合語言的輸出。這種輸出與jasmin[ ]的輸出相似,但包含的是Dalvik的位元組碼。我們會在下一節詳細介紹一下Dedexer。
res 目錄
res目錄存放資源檔。
resources.arsc
編譯後的二進位資源檔。
其中dex的格式參見:http://www.retrodev.com/android/dexformat.html
apk檔案解壓後反編譯:
圖片等多媒體檔案:沒有編譯,無需反編譯。
layout等二進位xml檔案:使用AXMLPrinter將其轉換為可讀的xml檔案:java -jar AXMLPrinter2.jar main.xml > new_main.xml
工具:http://code.google.com/p/android4me/downloads/list
是直接列印出來一個main.xml
要開啟AndroidManifest.xml或者其他xml也同理
class檔案反編譯:
Android模擬器中提供了一個dex檔案的反編譯工具,dexdump。用法為首先啟動Android模擬器,把要查看的dex檔案用adb push上傳的模擬器中,然後通過adb shell登入,找到要查看的dex檔案,執行dexdump xxx.dex。
然後找到上傳的要開啟的dex
然後可以看到反組譯碼之後的代碼如下
目前在網上能找到的另一個dex檔案的反編譯工具是Dedexer。Dedexer可以讀取dex格式的檔案,產生一種類似於組合語言的輸出。這種輸出與jasmin[ ]的輸出相似,但包含的是Dalvik的位元組碼。
resources.arsc這個檔案我是用了
漢化浪子編寫的 AndroidResEdit 軟體 能看到裡面的所有欄位
直接用記事本開啟大多數是亂碼
開啟如所示
以上就是apk檔案的詳細結構分析
apk檔案如果把其中的資源檔進行替換修改 比如進行類似漢化操作的時候
需要重新對其簽名
具體的可以替換的內容有res檔案下下的資源檔
而且res下面的資源檔中的圖片等多媒體檔案:沒有編譯,無需反編譯,這樣就可以很輕鬆地獲得一些比較好的apk應用裡的圖片,通過解碼xml檔案,可以還原原來應用的xml檔案,這樣,可以獲得其介面布局檔案。
在替換了之後,只需要使用Auto-sign工具重新對其進行簽名即可,首先,刪掉META-INF檔案夾下的簽名檔案
刪除CERT.RASA CERT.SF
只留下MANIFEST.MF檔案即可
然後使用Auto-sign工具重新對其進行簽名
具體的調用格式如下
@ECHO OFF<br />Echo Auto-sign Created By Dave Da illest 1<br />Echo Update.zip is now being signed and will be renamed to update_signed.zip<br />java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip update_signed.zip<br />Echo Signing Complete </p><p>Pause<br />EXIT<br />
重新簽名之後的apk包即可和原來的包一樣正常地安裝到手機上