Soot 靜態分析框架(二)Soot的核心

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的一些語言特點:

  1. 基於棧

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

 

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