c++ 反编译程序控制流的重构

lp0sw83n  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(87)

我正在为一个基本的编译字节码(一种完全不同的语言)写一个非常简单的反编译器(用C++)。执行器使用基于堆栈的机器,大多数指令都很容易拼凑起来。
我遇到了一个关于条件和循环结构的有趣的困境。如果前一个操作数的计算结果为false,字节码中的一个操作码将设置执行器的位置(有点像jmp指令)。因此,如果条件满足,执行器将在当前指令指针处继续执行。
现在,我已经将这些实现为简单的goto,但我想扩展此功能以将原始的if / else结构组合在一起。下面是原始源代码的示例:

function myFunction() {
  if (this.var1 == "foo") {
    this.var2 = "bar";
  } else {
    this.var2 = "baz";
  }
}

字符串
我的反编译输出:

goto label23;

function myFunction() {
    if (!(this.var1 == "foo")) {
        goto label16;
    }
    this.var2 = "bar";
    goto label21;
    label16:
        this.var2 = "baz";
    label21:
        return 0;
}
label23:


有没有一种方法可以应用到这个“反编译”的源代码中,将条件重新组合在一起,使其与原始源代码相似?我知道没有一个反编译器是完美的,但我很好奇像Ghidra这样的反编译器是如何解决这类问题的。因为我的字节码不一定是机器码(更像是压缩的源代码),所以我假设我的用例比Ghidra的反编译器简单得多。

mtb9vblg

mtb9vblg1#

Reko是一个反编译器,它试图从机器代码中重建类C代码。它有一个通道,可以重建高级结构,如ifwhileswitch语句。该代码基于Edward J. Schwartz,JongHyup Lee,马弗里克·吴和大卫·布鲁姆利。
虽然它是用C#编写的,但将一个类移植到C++并不困难。

相关问题