假设我有两个汇编代码程序。我想检查它们是否都来自相同的源代码,但其中一个是经过优化编译的。有没有可以做到这一点的工具?或者一些可以验证这一点的一般过程?
检查两个汇编程序(一个可能经过优化编译)是否来自同一个 C 源代码的方法?
逆向工程
部件
编译器优化
2021-06-13 18:39:44
1个回答
虽然您可以潜在地证明两段二进制代码是等效的(即,给定相同的输入,它们产生相同的结果),但这本身并不意味着源代码是相同的。例如,即使源不同,以下两个片段也可能被编译为相同的二进制文件:
int f(int x)
{
return x+1;
}
int g(int y)
{
return ++y;
}
也就是说,如果您确实想证明(例如)两个函数是等价的,您可以尝试许多不同的方法,例如:
- 汇编代码/二进制差异的手动比较(如果使用非常不同的编译器或优化设置,则可能不起作用)
- 反编译两个函数并比较输出(相同的警告)
- 如果输入状态不是很大,您可以使用所有可能的输入运行这两个函数并比较输出
- 在某些情况下,可以应用符号执行或SMT 求解器之类的东西
检测任意代码作者身份的一个更通用的问题称为“代码出处”,并且有几篇关于该主题的论文,例如:
- 谁编写了此代码?确定程序二进制文件的作者(Nathan Rosenblum 等人)
- BinPro:二进制源代码来源的工具(Dhaval Miyani 等人)
其它你可能感兴趣的问题