反編譯代碼與源代碼的比較算法
反編譯代碼與源代碼的比較算法
摘要:現有反編譯器產生的代碼與對應的源代碼之間存在差異,找到并理解差異有助于改進并完善反編譯器的設計。該文給出一種適用
于C 語言反編譯代碼與源代碼的比較算法。該算法以語法樹匹配方法為基礎,定義新的C 語言中間代碼表示形式并對表達式進行動態匹配,
提高了語法樹匹配的準確性。實驗結果表明,該算法能有效計算出反編譯代碼與源代碼之間的多數差異。
反編譯代碼:
int proc_1(int arg1){
int loc1,loc2;
loc1=arg1;
if(loc1==1||loc1==0)
loc2=1;
if(loc1!=1)
if(loc1!=0){
loc1--;
loc2=proc_1(loc1);
loc2+=proc_1(loc1); }
return loc2; }
在上述代碼中,一段計算Fibonacci 數的源代碼可能只是
一個if-else 語句,而對應的反編譯代碼卻包含了一個賦值語
句、2 個if 語句和一個return 語句。將程序轉換成中間代碼
能有效減少上述差異。因此,本文在CIL 的基礎上定義了一
種新的中間代碼表示形式ECIL,其主要語法結構如下:
func ::= Func(stmt list)
stmt ::= Loop(stmt list) | If(exp, stmt list)
| Instr(instr list) | Return(exp option)
| Goto (stmt)
instr::= Set(lvalue, exp)
| Call(lvalue option, exp, exp list)
非常好我支持^.^
(4) 100%
不好我反對
(0) 0%