2. Soot核心Body
Body 是對應的是Java一個函數體,Body是Soot的核心,Graph、Flow的構建都是基於Body進行分析,當然你可以基於不同的IR語言構建不同的Body,soot提供了JimpleBody,ShimpleBody, GrimpBody,當然soot主要是基於Jimple進行分析,在流程中構建的是JimpleBody,其它的Body的構建需要通過開關來控制
Soot提供了 ShimpleBody與JimpleBody的相互轉換
以及JimpleBody到GrimpBody的轉換
2.1 Trap
Trap 多對應的就是Java字節碼中的異常Table
我們以Jimple爲例子來解釋
2.2 Local:
Local 對應的是Java字節碼中的局部函數
2.2.1 IR 的Jimple
我們從上面的例子可以看到Jimple的一些語言特點:
- 基於棧
java語言的字節碼錶示本來就是棧的,而象Dalvik 是基於寄存器的,在這點上Jimple基於棧
2.有類型
每一個參數都定義了Type,並且類型精度沒有丟失,比如int $i0
3. 基於三地址分析
三地址解析中會出現很多的中間變量
三地址同時會拆解一些高級特性,被分解成多個單位,包含一些低級操作,支持低端指令
一般而言,三地址代碼將包含大部分低級操作,即目標機所支持的指令。
先看一個例子:
int i ,j; i = 2; j = 2*i + 8; |
轉化爲:
int i, j, temp$0, temp$1, temp$2, temp$3;
temp$0 = 2; i = temp$0; temp$1 = 2 * i; temp$2 = temp$1; temp$3 = temp$2 + 8; j = temp$3;
|
多個操作轉化成了三地址解析,通過temp來賦值
我們來看Java的字節碼的操作:
0: iconst_2 1: istore_1 2: iconst_2 3: iload_1 4: imul 5: iload_1 6: iadd 7: istore_2 |
在Java字節碼中也是低級操作,但沒有使用三地址方式,使用棧的方式來解決臨時變量的問題。
Jimple是直接翻譯的字節碼的操作,並沒有自己拆解複雜語句到低級操作
2.2.2 IR 的Shimple
Shimple 與Jimple的區別:SSA static single assignment form靜態單賦值,可用於流敏感操作
將程式碼轉換爲SSA形式,最簡單的方法,就是將每個被賦值的變數,以一個新的變數來取代,而新的變數名稱則爲一個帶着版號的舊變數
int i = i +100 |
i0 i0_0 i0_0=i0+100 |
2.3 Soot Stmt
Unit是Soot的單元, Stmt 繼承Unit代表着執行的語句,Soot將執行指令分成多個類型
過程內控制流
IfStmt , GotoStmt , SwitchStmt
過程間的控制流:
InvokeStmt ,ReturnStmt,ReturnVoidStmt., ThrowStmt
監控語句:MonitorStmt
賦值語句:DefinitionStmt
其它類型:NopStmt, BreakponitStmt
已經不使用的語句RetStmt
2.4 Soot box
盒子(Boxes)
一個盒子(Box)提供了一個間接訪問soot (Unit,Value)的入口,類似於Java的一個引用,當Unit包含另一個Unit的時候,需要通過Box來訪問,Soot 裏提供了兩種類型的Box, 一個是ValueBox一個是UnitBox
2.4.1 UnitBox
一個UnixBox包含着一個Unit操作,一個Unit的操作會包含着多個UnitBox(有些類型的Unit會包含其他Unit的引用,那麼這時候就需要包含Unixbox),比如說,GotoStmt 需要知道目標的Unit是什麼,所以一個Unit會包含其它的UnitBox,通過 UnitBox獲取下一個Unit
2.4.2 ValueBox
與Unit類似,我們通常也需要指向Value的box。這被表示爲ValueBox類。對於一個Unit,我們能夠得到一系列的ValueBox ,包含了在Unit中使用的值以及定義的值, 一個Valuebox對應這一個Value,而一個value可以對應多個ValueBox
比如上圖的i0<0的表達式就是包含一個valuebox, conditionexprbox,裏面包含着LtExpr的value,而LtExpr又包含這op1Box左邊和op2Box右邊兩個ValueBox, op1Box的valuebox又包含着i0這個local的本地value, 以及op2Box的ValueBox又包含着0這個常量Value
Unit 包含着多個UnitBox, ValueBox, 而UnitBox,ValueBox又指向獨立的Unit和Value, 這裏看來Box 更象一個指針,指向Value和Unit
中間表達式的適配
Soot 對每個IR Jimple, Shimple等構建了每個語言自己的Unit,Stmt,ValueBox,Value,以便於各種不同的IR的分析
2.4.3 Value
Value數據,常見的比如local 變量名, constant 常量
一個ValueBox就包含着Value,在上面的例子裏i1=0 等於是一個Stmt, i0是一個Valuebox,裏面包含這i0這個local 的value