检查两个汇编程序(一个可能经过优化编译)是否来自同一个 C 源代码的方法?

逆向工程 部件 编译器优化
2021-06-13 18:39:44

假设我有两个汇编代码程序。我想检查它们是否都来自相同的源代码,但其中一个是经过优化编译的。有没有可以做到这一点的工具?或者一些可以验证这一点的一般过程?

1个回答

虽然您可以潜在地证明两段二进制代码是等效的(即,给定相同的输入,它们产生相同的结果),但这本身并不意味着源代码是相同的。例如,即使源不同,以下两个片段也可能被编译为相同的二进制文件:

 int f(int x)
 {
  return x+1;
 }

 int g(int y)
 {
  return ++y;
 }

(检查https://godbolt.org/

也就是说,如果您确实想证明(例如)两个函数是等价的,您可以尝试许多不同的方法,例如:

  • 汇编代码/二进制差异的手动比较(如果使用非常不同的编译器或优化设置,则可能不起作用)
  • 反编译两个函数并比较输出(相同的警告)
  • 如果输入状态不是很大,您可以使用所有可能的输入运行这两个函数并比较输出
  • 在某些情况下,可以应用符号执行或SMT 求解器之类的东西

检测任意代码作者身份的一个更通用的问题称为“代码出处”,并且有几篇关于该主题的论文,例如:

  • 谁编写了此代码?确定程序二进制文件的作者(Nathan Rosenblum 等人)
  • BinPro:二进制源代码来源的工具(Dhaval Miyani 等人)