反編譯代碼與源代碼的比較算法
反編譯代碼與源代碼的比較算法
摘要:現(xiàn)有反編譯器產(chǎn)生的代碼與對應(yīng)的源代碼之間存在差異,找到并理解差異有助于改進(jìn)并完善反編譯器的設(shè)計。該文給出一種適用
于C 語言反編譯代碼與源代碼的比較算法。該算法以語法樹匹配方法為基礎(chǔ),定義新的C 語言中間代碼表示形式并對表達(dá)式進(jìn)行動態(tài)匹配,
提高了語法樹匹配的準(zhǔn)確性。實(shí)驗(yàn)結(jié)果表明,該算法能有效計算出反編譯代碼與源代碼之間的多數(shù)差異。
反編譯代碼:
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 數(shù)的源代碼可能只是
一個if-else 語句,而對應(yīng)的反編譯代碼卻包含了一個賦值語
句、2 個if 語句和一個return 語句。將程序轉(zhuǎn)換成中間代碼
能有效減少上述差異。因此,本文在CIL 的基礎(chǔ)上定義了一
種新的中間代碼表示形式ECIL,其主要語法結(jié)構(gòu)如下:
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%