smali框架源碼主要是對於baksmali的一個逆向過程,也就是其編譯過程。本身包的文件很少,也就是13個java文件
但是裏面有幾個有antlr3 和 jflex生成的詞法分析器和解釋器文件
smaliParser.java
smaliTreeWalker.java
這兩個文件時由 antlr3 生成的
smaliFlexLexer.java
這個文件是由 jflex生成的
對於這兩部分的生成,以及這兩個工具的使用,筆者未做深入研究。而smali本身最核心的地方就是利用這幾個詞法分析器 來生成不同的label,instruction,field,method,class等對象,最後組裝成dex文件,這幾個語義解析的文件主要還是爲smali提供彈藥,而真正組裝成最後我們看到的dex文件,其實是dexlib2做的事情。
下一步我們需要好好看看dexlib2的源碼框架。
其實前面描述了那麼多,不管是baksmali還是smali工具,多是涉及到一些對於dex文件的外圍io操作,而真正解析dex,解析dex各種指令,各種索引的操作是放在dexlib2這個目錄下面的,下面就讓我們走進dexlib2這個目錄,好好分析一下這個庫是如何解析android dex文件的吧。
還是老規矩,先介紹源碼的目錄結構已經關鍵代碼文件的作用,給大家有個整體上的認識再逐步細化。見下圖 dexlib2代碼目錄
這個是dexlib2的目錄,明顯看出來比baksmali和smali代碼量要多很多,這裏先將核心目錄給大家做一下介紹
analysis 這個暫時不知道具體作用
base 這個文件夾下面全部都是抽象類,主要是對於一些dex文件的一些基礎數據結構的一些表示
這裏面重點要注意的是這個目錄下面的 reference這個文件夾,裏面分別有 field索引,
method索引,string索引,以及type索引,這些都是跟dex文件本身組織結構息息相關的,
這裏如果不是太清楚的話,建議看一下dex文件的文件組織結構。裏面有表示string type
proto class的這些段的。
value 目錄下面的這些類都是跟類成員變量初始值相關的操作,比如 在某個類中的成員變量
String m_s = "hello world" 這個時候就要用到 BaseStringEncodedValue 這個類的操作
了
base 主目錄下的這幾個文件,
BaseAnnotation.java BaseAnnotationElement.java 跟註釋相關
BaseExceptionHandler.java try catch後的exceptionhandler相關
BaseMethodParameter.java 函數參數相關
BaseTryBlock try catch塊相關
builder 這個是爲生成dex文件的一些組件文件,
build/debug 下面是對於 dex文件中debug信息保存的類,爲最後生成dex做準備
build/instruction 對於dalvik虛擬機支持的所有指令的支持的類,格式很鮮明,基本上
每種類型的dalvik虛擬機指令用一個類來表示
build/ 這下面就放了一些對於debug信息,異常句柄,指令,swith case塊,
trycatch 塊,函數builder的一些實現
總之這個文件夾下是支撐將smali文件寫回爲dex文件的類庫
dexbacked 這個目錄其實是將輸入的dex進行解析後接受的類庫
dexbacked/instruction 解析後的dex的所有指令存放的類,也是以某類指令建立類來接收的
dexbacked/raw
對於dex文件結構的各個組件接收的類。比如typeid,stringid,classdef,protoid,mapitem,headeritem,這些對比dex文件的結構就能和這些類一一對應起來
dexbacked/reference dex文件中的成員變量索引,方法索引,字符串索引,類型索引的類
dexbacked/util 一些小的工具的類集合
dexbacked/value 還是跟初始值相關的類
dexbacked 一些更加上層抽象的類,表示的信息量更多,比如DexBackedClassDef.java
就表示一個類,但是這個類又是由n個成員變量,n個方法來表示的,對於
成員變量又涉及到了初始值,權限,訪問屬性,本身定義等,
對於成員方法就更復雜了,除了指令還有try catch信息 debug信息,註釋信息等等
總之, dexbacked這個類庫,有java語言完整表達了整個dex文件的文件結構,細化到dex文件的每個細節,就是說這個文件夾下的類已經能夠涵蓋dex文件所有的東西,裏面的每個類,每個方法,每條指令都能從這個文件夾下找到相應的類來表示。
iface 這個就是一個接口定義類,前面提到的base抽象類都是繼承與這個文件夾下面的類,主要是爲了 利用java多態的特點,減少代碼的編寫量,讓代碼看起來更加專業。
immutable
這個文件夾提供了爲類,方法,成員變量,指令,各種索引的不可更改的常量定義,但是這些類本身是可以new出來的,當你要爲dex文件添加類,方法,成員變量或者指令的 時候,這個文件夾下面的類就很有作用了,可以用這個文件夾下面的類輕鬆構造出來各種索引,達到更改dex文件的目的,一般要配合builder下的各種方法來使用
rewriter 這個文件夾下面提供了對於寫回dex文件各種函數的hook,包括寫回類的hook,
寫回方法的hook,甚至到寫回每條指令的hook,這個文件夾其實起到的作用也是爲了能夠
通過hook方便的修改dex文件。
writer 寫回dex文件啓動的文件夾,前面的builder這些都是爲其提供彈藥的,這裏整體的dex文件的生成
,所有組織都是通過這個文件夾下面的不同的類協同完成的。
. 直接根目錄下的是更基礎的訪問權限,指令格式,操作格式,索引,值類型的一些基礎類了