Android逆向基礎----APK檔案結構

來源:互聯網
上載者:User

標籤:source   http   hive   支援   訪問   values   參考   使用者   不一致   

參考這個部落格

http://www.cnblogs.com/wangtianxj/archive/2010/06/13/1757639.html

 

APK檔案結構:

 

AndroidManifest.xml                   配置清單

META-INF                                    簽名

assets                                         資源

classes.dex                                  java經過源碼編譯後產生的java位元組碼檔案

res                                               資產庫

lib                                                native 動態庫 so

smali                classes.dex

resources.arsc                             記錄這些ID和資源檔位置對應關係的檔案

apktool.yml            重新打包必須檔案

 

 

META-INF目錄:存放的是簽名資訊,用來保證apk包的完整性和系統的安全。

在編譯產生一個api包時,會對所有要打包的檔案做一個校正計算,並把計算結果放在META-INF目錄下。在安裝時,如果校正結果與META-INF下的內容不一致,系統就不會安裝這個apk。保證了apk包裡的檔案不能被隨意替換。

META-INF目錄下包含的檔案有CERT.RSA,CERT.DSA,CERT.SF和MANIFEST.MF。

CERT.RSA

是開發人員利用私密金鑰對APK進行簽名的簽名檔案

CERT.SF,MANIFEST.MF

記錄了檔案中檔案的SHA-1雜湊值

 

 

assets目錄:用於存放需要打包到APK中的靜態檔案

assets目錄支援任意深度的子目錄,使用者可以根據自己的需求任意部署檔案夾架構。

而且res目錄下的檔案會在.R檔案中產生對應的資源ID,assets不會自動產生對應的ID,訪問的時候需要AssetManager類。

 

lib目錄:這裡存放應用程式依賴的native庫檔案,一般是用C/C++編寫,這裡的lib庫可能包含4中不同類型,根據CPU型號的不同,大體可以分為ARM架構,ARM-V7a架構,MIPS架構和X86架構。

不同的CPU架構對應著不同的目錄,目前市場上使用的移動終端大多是基於ARM或者ARM-V7a架構的,X86和MIPS架構的移動智能終端比較少,這四個目錄要根據CPU的架構來選,而市面上ARM架構的手機佔大多數,所以一般的APK只包含ARM和ARM-V7a的so。

 

res目錄:res是resource的縮寫,這個目錄存放資源檔,存在這個檔案夾下的所有檔案都會映射到Android工程的.R檔案中,產生對應的ID,訪問的時候直接使用資源ID即R.id.filename,res檔案夾下可以包含多個檔案夾。

檔案名稱

儲存內容

anim

存放動畫檔案;

drawable

目錄存放映像資源;

layout

目錄存放布局檔案;

values

目錄存放一些特徵值;

colors.xml

存放color顏色值;

dimens.xml

定義尺寸值;

string.xml

定義字串的值;

styles.xml

定義樣式對象;

xml

檔案夾存放任意xml檔案,在運行時可以通過Resources.getXML()讀取;

raw

是可以直接複製到裝置中的任意檔案,他們無需編譯。

 

AndroidManifest.xml:是Android應用程式的設定檔,是一個用來描述Android應用“整體資訊”的設定檔案, Android系統可以根據這個“自我介紹”完整地瞭解APK應用程式的資訊,每個Android應用程式都必須包含一個AndroidManifest.xml檔案,且它的名字是固定的,不能修改。我們在開發Android應用程式的時候,一般都把代碼中的每一個Activity,Service,Provider和Receiver在AndroidManifest.xml中註冊,只有這樣系統才能啟動對應的組件,另外這個檔案還包含一些許可權聲明以及使用的SDK版本資訊等等。程式打包時,會把AndroidManifest.xml進行簡單的編譯,便於Android系統識別,編譯之後的格式是AXML格式,如1所示:

 

圖1 AXML格式

 

axml頭

其中的axml頭是固定標識axml檔案的,其值固定時0x00080003。

axml檔案長度

標識axml檔案的大小。

StringDataSegment

xml檔案中所有字串類型儲存在此。

ResourceIdSegment

xml檔案中聲明的資源檔ID儲存於此。

XmlContentSegment

是xml的內容段,按照xml檔案中的結構依次排開,儲存xml的資料內容。

classes.dex:

傳統的Java程式,首先先把Java檔案編譯成class檔案,位元組碼都儲存在了class檔案中,Java虛擬機器可以通過解釋執行這些class檔案。而Dalvik虛擬機器是在Java虛擬機器進行了最佳化,執行的是Dalvik位元組碼,而這些Dalvik位元組碼是由Java位元組碼轉換而來,一般情況下,Android應用在打包時通過AndroidSDK中的dx工具將Java位元組碼轉換為Dalvik位元組碼。dx工具可以對多個class檔案進行合并,重組,最佳化,可以達到減小體積,縮短已耗用時間的目的。dx工具的轉換過程2所示:

 

圖2 dx工具把.class檔案轉換成dex檔案

      dx工具把每個.class檔案的每個地區的內容進行去重,重組,最佳化重排後產生dex檔案,產生的dex檔案可以在Dalvik虛擬機器執行,且速度比較快。

 

resources.arsc:用來記錄資源檔和資源ID之間的映射關係,用來根據資源ID尋找資源。Android的開發是分模組的,res目錄專門用來存放資源檔,當在代碼中需要調用資源檔時,只需要調用findviewbyId()就可以得到資源檔,每當在res檔案夾下放一個檔案,aapt就會自動產生對應的ID儲存在.R檔案,我們調用這個ID就可以,但是只有這個ID還不夠,.R檔案只是保證編譯器不報錯,實際上在程式運行時,系統要根據ID去尋找對應的資源路徑,而resources.arsc檔案就是用來記錄這些ID和資源檔位置對應關係的檔案。

Android逆向基礎----APK檔案結構

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.