Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compi

  接着上一篇,如今明確問題:在彙編克隆搜索文獻中,有四種類型的克隆[15][16][17]:Type1.literally identical(字面相同);Type2.syntactically equivalent(語法等價);Type3.slightly modified(稍做修改);Type4.semantically similar(語義類似)。文章主要關注類型4克隆,雖然彙編代碼有可能在語法上不一樣,可是在源代碼層次函數的功能邏輯是相同的。例如,有混淆和沒有混淆的相同代碼,或者不一樣版本的之間的補丁源代碼。網絡

  本文使用如下概念:架構

function:彙編函數ide

source function:用源代碼(eg.C++)寫的源函數函數

repository funcation:存儲庫中索引的彙編函數學習

target function:要查詢的彙編函數(query)ui

問題定義:給定一個目標函數ft,搜索問題是從倉庫中取出top-k repository funcations(fs屬於RP),經過它們的語義類似度進行排名,這樣就能夠視爲Type4克隆。
spa

  Asm2Vec模型整體工做流程如圖所示:架構設計

步驟1:給定彙編函數的存儲庫,首先爲這些函數構建神經網絡模型,只須要彙編代碼做爲訓練數據不須要任何先驗知識。設計

步驟2:在訓練階段後,模型爲每個存儲庫的函數生成一個向量表示。日誌

步驟3:給定一個沒有通過該模型訓練的目標函數ft,使用該模型來生成它的向量表示。

步驟4:使用餘弦將ft的向量與存儲庫中的其餘向量進行比較,類似性檢索排名前k的候選項做爲結果。

  訓練過程是一次性的工做,能夠有效地學習查詢的表示。若是向存儲庫中添加了新的彙編函數,將按照步驟3中的相同過程來估計其向量表示。該模型能夠按期進行再訓練,以保證向量的質量。

 

彙編代碼的表示學習

  接下來討論彙編代碼的表示學習模型。具體來講,本文的設計基於PV-DM模型[20]。PV-DM模型基於文檔中的tokens來學習文檔表示,然而,文檔是按順序排列的和彙編代碼不同,彙編代碼能夠表示爲圖形,並具備特定的語法。首先介紹一下原始的PV-DM神經網絡,它是用來學習文本段落的向量表示,而後創建Asm2Vec模型,並描述它是如何在給定函數的指令序列下進行訓練的,最後闡述如何將控制流圖建模爲多個序列。

  PV-DM模型是爲文本數據而設計的,它是原word2vec模型的擴展,它能夠爲每一個單詞和每一個段落共同窗習向量表示。給定一個包含多個句子的文本段落,PV-DM在每一個句子上應用一個滑動窗口。滑動窗口從句子的開頭開始,每一步向前移動一個單詞。例如在圖中滑動窗口的大小爲5。第一步,滑動窗口包含五個詞「the‘’,「cat」,「sat」,「on」和「a」。中間的單詞「sat」做爲目標,周圍的單詞做爲上下文。在第二步中,窗口向前移動一個單詞包含「cat」,「sat」,「on」,「a」和mat,其中「on」是目標。每一步,PV-DM模型執行一個多層次預測任務(如圖)

它將基於當前段ID把當前段映射成向量,基於文檔中的word ID把每一個word映射成向量。經過softmax分類中的單詞表來平均這些向量和預測目標詞。反向傳播的分類錯誤將用於更新這些向量。

  PV-DM是爲按順序排列的文本數據而設計的,然而,彙編代碼比純文本更具備豐富的語法。它包含與純文本在結構上不一樣的操做,操做流和控制流。這些差別須要不一樣的模型架構設計,而PV-DM沒法解決這些問題。

Asm2Vec 模型

  彙編函數能夠用控制流程圖(CFG)來表示,本文將控制流程圖建模爲多個序列,每個序列對應着一個包含線性排列的彙編指令的潛在執行路徑。給定一個二進制文件,使用IDA pro反彙編去提取彙編函數及其基本塊和控制流程圖列表。

  首先介紹Asm2Vec模型流程圖中的步驟1和步驟2工做細節:

咱們訓練模型爲每個存儲庫的函數產生一個數值向量。下面是該模型用來處理彙編代碼的神經網絡結構:

(The proposed Asm2Vec neural network model for assembly code)

  首先,將存儲庫中的每個函數映射成一個向量。收集了存儲庫中全部獨特的tokens,在彙編代碼中將操做和操做數視爲tokens,將每個token t 映射爲一個數值向量t1和另外一個數值向量t1`,在訓練後t1表示爲詞彙語義,t1向量可視化了tokens之間的關係。t1`是用來作token預測的。全部的函數向量表示和token向量t1都初始化爲在0附近的小隨機值,全部的t1`向量都隨機化爲0。用一種定義2xd來把一條指令的操做和操做數聯繫起來。

  而後,把存儲庫中的函數生成多個指令序列seqs,假設序列的順序是隨機的。每一個序列有多條指令,當前的那條指令的定義包含了當前那條指令的全部的操做數和當前指令的一個操做。常量tokens被規範爲十六進制形式。

  對於函數中的每一個序列seq,神經網絡從序列的開端開始遍歷指令。收集一個序列中的當前指令,以前一個指令和以後一個指令,忽略邊界(當前seq)以外的指令。提出的模型試圖在存儲庫函數中最大化如下邏輯機率:

對於在給定的當前彙編函數和附近指令的狀況下,它最大化了在當前指令處看到token的日誌機率。直覺上是使用當前函數的向量和附近指令提供的上下文來預測當前指令。相鄰指令提供的向量捕獲有詞彙語義關係。函數的向量記住了在特定環境下所能預測的東西。它爲區分當前函數和其餘函數在指令層次建模。

  模型具體步驟流程:

1.對於一個給定的函數fs,經過以前構造的字典,首先查找它的向量表示。

2.爲附近(一前一後)的指令建模:針對每條指令,先對其進行操做數的向量平均操做,而後對指令的操做和獲得的平均向量進行鏈接合併操做。

3.將前指令鏈接合併獲得的向量,後指令鏈接獲得的向量,和給定函數找到的向量,三者進行平均操做。

相關文章
相關標籤/搜索