安卓逆向入门教程(一)
初識(shí)APK
0x01.什么是APK
概念
APK是AndroidPackage的縮寫(xiě),即Android安裝包(apk)。APK是類(lèi)似Symbian Sis或Sisx的文件格式。通過(guò)將APK文件直接傳到Android模擬器或Android手機(jī)中執(zhí)行即可安裝。apk文件和sis一樣,把a(bǔ)ndroid sdk編譯的工程打包成一個(gè)安裝程序文件,格式為apk。 APK文件其實(shí)是zip格式,但后綴名被修改為apk,通過(guò)UnZip解壓后,可以看到Dex文件,Dex是DalvikVM executes的簡(jiǎn)稱(chēng),即Android Dalvik執(zhí)行程序,并非Java ME的字節(jié)碼而是Dalvik字節(jié)碼。Android在運(yùn)行一個(gè)程序時(shí)首先需要UnZip,然后類(lèi)似Symbian那樣直接,和Windows Mobile中的PE文件有區(qū)別。
組成
解壓縮apk后,一般包含如下文件結(jié)構(gòu)
?
1.assets文件夾
- 資源目錄:存放網(wǎng)頁(yè),圖片,JSON等資源
- 靜態(tài)資源文件,不需要生成索引
- Java代碼中需要用AssetManager來(lái)訪(fǎng)問(wèn)
- 視頻、音頻等資源放在此目錄
2.lib文件夾
- so庫(kù)存放位置,一般由NDK編譯所得到,常見(jiàn)于使用游戲引擎或JNI native調(diào)用過(guò)程中
3.META-INF文件夾
- 存放工程的屬性文件,簽名信息,用來(lái)保證apk包的完整性和系統(tǒng)的安全。編譯器編譯成功apk包時(shí),會(huì)對(duì)所有要打的包的文件做個(gè)校驗(yàn)計(jì)算,并把計(jì)算結(jié)果放到META-INF目錄下,這就保證了apk包里的文件不能隨意被替換。
4.res文件夾
- 資源目錄:存放資源文件,包括圖片,字符串
- 編譯后會(huì)生成索引R.java,在Java代碼中用R.xxx.yyy來(lái)索引
5.AndroidMainifest.xml文件
- Androdi工程配置的基礎(chǔ)文件,它描述了應(yīng)用的名字,版本,權(quán)限,應(yīng)用的庫(kù)文件等信息。
- apk中的AndroidMainifest.xml是被壓縮過(guò)的
6.classes.dex文件
- Java代碼編譯后最終生成的Dalvik字節(jié)碼文件
- Android使用的Dalvik虛擬機(jī)標(biāo)準(zhǔn)與Java虛擬機(jī)標(biāo)準(zhǔn)不兼容
7.resources.arsc文件
- 編譯后的二進(jìn)制資源文件,對(duì)res目錄資源的一個(gè)索引文件,保存了原工程中的文件,例如strings.xml等文件內(nèi)容,
8.其他文件夾
0x02.什么是Dalvik
1.Dalvik虛擬機(jī)
Dalvik虛擬機(jī),是Google等廠商合作開(kāi)發(fā)的Android移動(dòng)設(shè)備平臺(tái)的核心組成部分之一。它可以支持已轉(zhuǎn)換為.dex(即“Dalvik Executable”)格式的Java應(yīng)用程序的運(yùn)行。.dex格式是專(zhuān)為Dalvik設(shè)計(jì)的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)。
2.與Java虛擬機(jī)區(qū)別
- Dalvik虛擬機(jī)是基于寄存器,而JVM虛擬機(jī)是基于棧,
- Dalvik有專(zhuān)屬文件執(zhí)行格式dex(dalvik executable),JVM執(zhí)行的是Java字節(jié)碼。
- Dalvik VM速度比JVM更快,占用空間更少
3.修改Dalvik的字節(jié)碼
- 通過(guò)Dalvik的字節(jié)碼不能直接看到原來(lái)的邏輯代碼,需要借助第三方工具,例如Apktool或dex2jar+jd-gui工具來(lái)幫助查看。
- 如果想修改apk則需要操作的文件是.smali文件,而不是導(dǎo)出來(lái)的Java文件重新編譯
0x03.什么是Smail
- Smali,Baksmali分別是指安卓系統(tǒng)里的Java虛擬機(jī)(Dalvik)所使用的一種.dex格式文件的匯編器,反匯編器。其語(yǔ)法是一種寬松式的Jasmin/dedexer語(yǔ)法,而且它實(shí)現(xiàn)了.dex格式所有功能,對(duì)apk反編譯之后,便會(huì)生成此類(lèi)文件,其中在dalvik字節(jié)碼中,寄存器都是32位的,可以支持任何類(lèi)型,64位類(lèi)型要用2個(gè)寄存器表示,其中Dalvik字節(jié)碼有兩種類(lèi)型:原始類(lèi)型和`引用類(lèi)型(包括對(duì)象和數(shù)組)
- 具體語(yǔ)法請(qǐng)參考此篇文章:Android逆向之smali語(yǔ)法寶典
轉(zhuǎn)載于:https://www.cnblogs.com/CnKker/p/11125223.html
總結(jié)
以上是生活随笔為你收集整理的安卓逆向入门教程(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: step1 . day6 C语言基础练习
- 下一篇: 6.12实训作业