2012-05-16 35 views
2

我具有的值的同時執行特定代碼的程序計數器取序列。使用這個,我想對產生這個可執行文件的原始代碼做一些靜態分析(要清楚:原始代碼不可用) - 特別是,有多少個循環,以及它們是如何嵌套的。舉個例子,利用在程序計數器(指令指針)圖案檢測環路值

A: for() 
B:  if() 
C:   ... 
D:  else 
E:   ... 
F:  for() { 
G:   ... 
H:   ... 
I:  } 

在這種情況下,程序計數器順序可能是:ABCDF {GHIGHIGHI} ABDEF {GHIGHI} ABDEF {GHIGHIGHIGHI}

從上面的順序,我怎麼能得到一個想法有兩個循環,一個嵌套在另一個內?只是指出使用適當的解析技術也會有所幫助。

如在原始代碼中沒有goto和沒有編譯器優化的循環展開某些簡化假設可。

+0

你爲什麼不只是分析的原代碼,並檢測出含有(使用標準的控制流分析算法)的循環? PC值提供了什麼(除了驗證特定點實際上是代碼)? [這可能是有用的混淆代碼,故意不執行跳轉到廢話的位置] –

+0

...我的反應來自於你聲稱擁有源代碼,這是一個非常高質量的信息源,然而你似乎正在尋找其他相同的信息。 –

+0

@IraBaxter我編輯了這個問題,以澄清原始源代碼不可用。對困惑感到抱歉。 – sundar

回答

2
  1. 從程序計數器序列中創建一個圖表,其中每個程序計數器是一個頂點,序列中的每對連續程序計數器都是一個有向邊。 (如果從一個頂點到另一個頂點有幾條邊,只保留其中一個)。
  2. 從序列中第一個程序計數器產生的頂點開始,執行深度優先搜索以查找週期。找到每個循環後,將該循環的最後一個邊移到一個單獨的列表中。
  3. 所有周期後,被發現和移出圖形,你有一個DAG(有向無環圖)。在這個DAG上執行拓撲排序,以恢復程序中正確的語句順序,與源代碼完全一樣,除了if/else塊(你不能從程序計數器序列中確定哪一個是'if',哪個是'else' )。爲了獲得正確的結果,在拓撲排序不規定任何特定順序的情況下,應該使用深度優先搜索順序。爲了正確放置while/for循環體,可以使用來自步驟2的一些附加信息:循環檢測算法可以標記每個循環的第二個節點。
  4. 要分析if/else塊,請在圖中創建單獨的拆分/合併列表。
  5. 聯合循環(上的步驟2提取的),並且如果/ ELSE(萃取的步驟4)的列表的列表轉換間隔的一個單獨的列表。使用這些間隔的關係(哪一個嵌套在另一箇中)爲/ if/else語句的所有構造樹。
  6. 在一些情況下,「如果」在端塊「而」循環while{...if{}}可能被錯誤地檢測,由於同時{環{} ...},與「而」和「環」相同的起始地址。由於'while'的起始地址不能與任何嵌套循環的起始地址重合,因此可能很容易將其後處理回while{...if{}}。 (嵌套'do-while'循環可能具有相同的起始地址,但嵌套的'if'沒有任何問題)。

這種方法只適用於簡單的情況下,當沒有「轉到」,「破」,或任何其他跳出週期和「爲」循環只檢查一個條件的時候。