通过仿真将二进制可执行文件反编译成c/asm代码,可行吗?

逆向工程 拆卸 反编译 追踪
2021-06-18 03:10:19

我正在考虑使用二进制可执行文件的运行时行为来提取可用编译数据的反编译方法。分析运行时行为(即在每条 cpu 指令后捕获并检查它的作用),我们可以获得很多附加信息,例如:

  • 我们可以区分静态常量数据(“ .text”)和二进制 asm
  • 附加信息,哪个寄存器或全局/局部变量(指针、浮点数和整数)中的数据类型是什么
  • cpu指令开始的地方
  • 从堆栈行为中,我们可以获得非常有用的启发式方法,函数/内部函数在哪里以及它们具有多长时间/什么类型的参数。

在我看来,即使是圣杯,可重新编译的源代码也不会那么遥远。

是否可以?是否已经存在能够执行此操作的任何工具/软件?

1个回答

这个问题与图灵机(已知是不可判定的)上的停机问题有关。

通过仿真进行反编译假设您必须至少运行一次软件的所有分支,并且如果您必须经过(潜在的)无限循环,则无法保证到达所有可能的程序点。

然而,这是一个你在现实生活中不太可能发现的理论问题(除非它是故意植入这里以防止通过仿真进行全面探索)。

但是,从更实际的角度来看,只有在运行时可以轻松遍历所有路径时,才能探索所有路径,而当用户需要解决挑战(可能是在线的)时,例如给定其哈希值存储在程序中的密码,或者通过签署消息并将其返回给软件来证明他拥有私钥。