初識APK
0x01.什么是APK
概念
APK是AndroidPackage的縮寫,即Android安裝包(apk)。APK是類似Symbian Sis或Sisx的文件格式。通過將APK文件直接傳到Android模擬器或Android手機中執行即可安裝。apk文件和sis一樣,把android sdk編譯的工程打包成一個安裝程序文件,格式為apk。 APK文件其實是zip格式,但后綴名被修改為apk,通過UnZip解壓后,可以看到Dex文件,Dex是DalvikVM executes的簡稱,即Android Dalvik執行程序,並非Java ME的字節碼而是Dalvik字節碼。Android在運行一個程序時首先需要UnZip,然后類似Symbian那樣直接,和Windows Mobile中的PE文件有區別。
組成
解壓縮apk后,一般包含如下文件結構
1.assets文件夾
- 資源目錄:存放網頁,圖片,JSON等資源
- 靜態資源文件,不需要生成索引
- Java代碼中需要用AssetManager來訪問
- 視頻、音頻等資源放在此目錄
2.lib文件夾
- so庫存放位置,一般由NDK編譯所得到,常見於使用游戲引擎或JNI native調用過程中
3.META-INF文件夾
- 存放工程的屬性文件,簽名信息,用來保證apk包的完整性和系統的安全。編譯器編譯成功apk包時,會對所有要打的包的文件做個校驗計算,並把計算結果放到META-INF目錄下,這就保證了apk包里的文件不能隨意被替換。
4.res文件夾
- 資源目錄:存放資源文件,包括圖片,字符串
- 編譯后會生成索引R.java,在Java代碼中用R.xxx.yyy來索引
5.AndroidMainifest.xml文件
- Androdi工程配置的基礎文件,它描述了應用的名字,版本,權限,應用的庫文件等信息。
- apk中的AndroidMainifest.xml是被壓縮過的
6.classes.dex文件
- Java代碼編譯后最終生成的Dalvik字節碼文件
- Android使用的Dalvik虛擬機標准與Java虛擬機標准不兼容
7.resources.arsc文件
- 編譯后的二進制資源文件,對res目錄資源的一個索引文件,保存了原工程中的文件,例如strings.xml等文件內容,
8.其他文件夾
0x02.什么是Dalvik
1.Dalvik虛擬機
Dalvik虛擬機,是Google等廠商合作開發的Android移動設備平台的核心組成部分之一。它可以支持已轉換為.dex(即“Dalvik Executable”)格式的Java應用程序的運行。.dex格式是專為Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統。
2.與Java虛擬機區別
- Dalvik虛擬機是基於寄存器,而JVM虛擬機是基於棧,
- Dalvik有專屬文件執行格式dex(dalvik executable),JVM執行的是Java字節碼。
- Dalvik VM速度比JVM更快,占用空間更少
3.修改Dalvik的字節碼
- 通過Dalvik的字節碼不能直接看到原來的邏輯代碼,需要借助第三方工具,例如Apktool或dex2jar+jd-gui工具來幫助查看。
- 如果想修改apk則需要操作的文件是.smali文件,而不是導出來的Java文件重新編譯
0x03.什么是Smail
- Smali,Baksmali分別是指安卓系統里的Java虛擬機(Dalvik)所使用的一種.dex格式文件的匯編器,反匯編器。其語法是一種寬松式的Jasmin/dedexer語法,而且它實現了.dex格式所有功能,對apk反編譯之后,便會生成此類文件,其中在dalvik字節碼中,寄存器都是32位的,可以支持任何類型,64位類型要用2個寄存器表示,其中Dalvik字節碼有兩種類型:原始類型和`引用類型(包括對象和數組)
- 具體語法請參考此篇文章:Android逆向之smali語法寶典