APK文件結構


APK文件結構

APK文件結構

APK是Android Package的縮寫,即Android安裝包,所有的Android程序都是以APK文件的形式發布的。可以在模擬器或手機上運行APK文件來安裝程序。APK文件的后綴為.apk,但是其格式是壓縮文件zip的格式。可以通過WinZip、WinRAR等將其解壓。直接將該文件擴展名改為.zip就可以解壓該文件來了解APK文件的結構。

解壓

可以將apk文件重命名為.zip格式的文件,然后用解壓軟件打開。也可以設置解壓軟件關聯apk文件。
比如WinRAR軟件,找到“選項”——“設置”——“集成”,在“用戶自定義壓縮文件擴展名”處填上apk,點“確定”保存即可。之后就可以直接雙擊以WinRAR打開apk安裝包文件。


通常APK文件包括以下文件夾或文件:

簡述版

  • META-INF文件夾:簽名文件目錄
  • res文件夾:資源庫目錄 一般存放xml布局文件和圖標
  • AndroidMainifest.xml :配置清單(二進制格式)
  • classes.dex:安卓系統上的可執行文件,也是我們逆向的主要的文件,源碼都被編譯在里面,如有多個是因為每個dex里最多存放65535個方法,而項目的方法數超出了這個數量,所以被分成多個保存
  • resources.arsc:資源索引文件,包含語言包,漢化的話一般是反編譯這個文件
  • assets :資源目錄,一般存放圖片
  • lib:是動態庫目錄 一般存放so文件

詳細版

META-INF文件夾

META-INF文件夾只存在於簽名后的apk文件中,其中包含MANIFEST.MF、CERT.SF和CERT.RSA文件。MANIFEST.MF文件包含了apk文件中所有文件的名稱和此文件的SHA1摘要值。而CERT.SF和CERT.RSA文件是使用jarsigner工具生成的簽名文件和簽名塊文件,在CERT.SF文件中默認會包含整個MANIFEST.MF文件的SHA1 摘要值;CERT.RSA文件存放對CERT.SF文件的簽名,同時還包含從keystore文件中生成的證書或者證書鏈。在應用程序管理器安裝apk文件的過程中會檢查證書,對比每個文件的摘要值是否匹配,防止應用程序被篡改。


META-INF文件夾下存放了APK文件的基本信息和簽名信息,用來保證APK文件的完整性和系統的安全。類似於jar文件,META-INF文件夾下的MANIFEST.MF文件,說明Manifest文件的版本和創建者,以及相關文件的校驗信息。Android系統在安裝某個APK文件時會對APK中壓縮的各個文件進行校驗檢查,如果校驗結果與META-INF下的內容不一致,系統就不會安裝這個APK文件,這就保證了程序安裝包的安全性。例如解壓一個APK文件,替換里面的一幅圖片、一段代碼,或一段版權信息,然后重新壓縮打包,即使這個APK文件符合格式要求,但是也無法通過校驗進行安裝。所以這樣就給病毒感染和惡意修改增加了難度,可以有效地保護系統安全。

res文件夾

res文件夾存放資源文件。由此也可以看到APK文件對資源文件的保護性較差,任何人都可以通過解壓縮的方式從APK文件中提取相關的資源文件,如圖片、音頻等。

AndroidManifest.xml

AndroidManifest.xml是每個應用程序都必須定義和包含的全局配置文件,它描述了應用程序的名稱、版本、權限、引用的庫文件等信息。但是不同於系統開發時在項目文件夾中所看到的AndroidManifest.xml文件,在APK文件中,AndroidManifest.xml是經過壓縮的,如果直接打開將看到亂碼。可以通過相關工具將其解壓。

classes.dex

Dalvik虛擬機運行dex文件,而不是傳統的class文件,DX工具將編譯后的class文件轉換成一個dex文件。在程序運行時,Dalvik虛擬機從dex中裝載讀取指令和數據。
classes.dex是Java源代碼編譯后生成的Dalvik虛擬機字節碼文件,類似於Java虛擬機使用的.class類文件。由於Android使用的Dalvik虛擬機與標准的Java虛擬機是不兼容的,因此dex文件與class文件相比,不論是文件結構還是操作碼都不一樣。如果編寫的源程序有多個Java類,都會將其編譯到同一個classes.dex文件中,也就是說不論程序是簡單還是復雜,每個APK文件只有一個classes.dex文件,而傳統的Java應用程序,往往包含多個class文件,這樣就不可避免地增加了冗余信息。將class文件整合到一起,可以減小類文件的尺寸、IO操作,提高類的查找速度。Android模擬器中提供了一個dex文件的反編譯工具— dexdump,可以對其進行反編譯。

resources.arsc

resources.arsc是編譯后的二進制資源文件,內容包含了開發程序時項目文件夾中res子文件夾下main.xml、strings.xml等文件的信息。

lib、assets

除了以上文件夾和文件,在有些APK文件中,還有可能出現lib文件夾和assets文件夾。這兩個文件夾中分別存放應用軟件需要調用的庫文件和其他資源配置文件。

簽名

Android的軟件也需要簽名,卻簡單方便,首先是不需要自己去申請證書,下載個簽名工具就可以簽名了。另外,我們從電子市場、軟件官網下載來的軟件都是已經簽好名的,可以直接安裝,這里講到的簽名,是針對軟件安裝包被修改過的情況(如漢化需要修改安裝包內的文件,原來的簽名文件就不能用了,所以要重新簽名軟件才能正常安裝。),正常情況下不需要簽名。
現在Android可用的簽名工具很多,可以用漢化浪子出品的AndroidResEdit,這個軟件自帶簽名包。
簽名方法很簡單,刪除原證書文件后(META-INF 文件夾內的.RSA、.SF、***.MF三個文件),打開AndroidResEdit——簽名——簽名apk文件,選擇需要簽名的apk安裝包后點擊“立即簽名”即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM