反编译代码与源代码的比较算法
反编译代码与源代码的比较算法
摘要:现有反编译器产生的代码与对应的源代码之间存在差异,找到并理解差异有助于改进并完善反编译器的设计。该文给出一种适用
于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%