安卓逆向學習——Dalvik虛擬機與Smali代碼

首先我們要清楚JAVA虛擬機和Dalvik虛擬機的關係,我們想要我們的android程序運行在Dalvik虛擬機上首先需要選擇一種語言執行的環境,Android開發目前最多用的就是JAVA語言,凱特琳語言也在飛速發展,也許以後可能就要取代Java在安卓開發的地位。JAVA代碼想要運行在Java虛擬機上首先要編譯成Class文件,Java虛擬機纔可以識別程序命令運行程序。想要在Dalvik虛擬機上運行,還需要將Java虛擬機內的代碼提取出來轉換成Dalvik所能識別的機器指令並進行打包成Dex文件,所以需要進一步將Class文件轉換成Dex文件,才能運行在Dalvik上。這種Dalvik可以識別的字節碼符號就是Smali代碼。
Dex文件相比Class文件更小,因爲Dalvik虛擬機的文件結構已經被谷歌公司所優化過,Java虛擬機運行是依賴棧結構的,而Dalvik虛擬機是基於寄存器傳遞的。(棧的存儲介質是內存肯定不如直接相連於CPU上的寄存器快了)
在這裏插入圖片描述
有趣的是,雖然它們都是依賴於虛擬機的語言,但是它們並沒有進行編譯成可執行程序,它們編譯後的代碼更類似於腳本語言。(腳本語言都是依賴對應的一個調用腳本語言的解釋器,我們實際上寫的腳本都只是符號,不可以直接運行,需要這些解釋器進行解析,將這些符號替換成解釋器裏早就設置好的各種調用接口,通過這些調用接口進一步進行系統調用,才能看到我們想要的執行效果)解釋一步就執行一步,所以調試起來比正常的EXE困難。而JAVA語言就更加有趣,他不同於腳本的是需要首先將代碼編譯成虛擬機可以識別的字節碼符號,然後虛擬機通過編譯後的符號進行解釋,這種介於編譯和解釋之間的操作還是很有趣的。
下圖是整個安卓程序的運行框架。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章