假设我有一个在 GPL 下发布的项目,任何人都可以使用源代码。后来我发现了一个非常相似的产品,但是作为封闭源代码,仅由其他人分发二进制文件。
有没有一种好方法可以找出他们在他们的产品中使用我的源代码?
如果解决方案是以某种方式对二进制文件进行逆向工程,是否有可能以某种方式自动化它?
编辑:澄清。寻找错误是一种选择,但不是确定的,特别是如果项目是一个库并且二进制文件添加了自己的 GUI,例如。我感兴趣的情况是代码被解除的情况并不明显。
假设我有一个在 GPL 下发布的项目,任何人都可以使用源代码。后来我发现了一个非常相似的产品,但是作为封闭源代码,仅由其他人分发二进制文件。
有没有一种好方法可以找出他们在他们的产品中使用我的源代码?
如果解决方案是以某种方式对二进制文件进行逆向工程,是否有可能以某种方式自动化它?
编辑:澄清。寻找错误是一种选择,但不是确定的,特别是如果项目是一个库并且二进制文件添加了自己的 GUI,例如。我感兴趣的情况是代码被解除的情况并不明显。
错误。
如果封闭源版本与您的项目共享大部分错误,则可能已“解除”。
您也可以尝试使用封闭源二进制文件的反编译版本来反编译您自己的二进制文件……尽管这可能不可靠。
显然,如果可疑的二进制文件不是stripped
,您可以只查找与您的代码同名的任何符号。
在反编译和逆向工程二进制代码方面有大量工作。世界专家大概是克里斯蒂娜·西富恩特斯。她在反编译方面做了很多工作。写信给Alex Aiken并询问他的软件相似度测量工具是否可以适用于二进制代码也会很有趣。
一个明显的方法是搜索字符串。运行 unix 字符串工具并查看二进制文件是否包含代码中的任何文字字符串。主要是消息框中的错误消息和文本。
寻找软件胎记。这种方法试图建立基于二进制代码或动态行为的软件之间的链接。Christian Collberg 是软件水印方面的专家,胎记就是由此而来。这一切都还在研究领域。
您可以尝试反汇编这两个程序并比较程序集,但如果他们使用不同的编译器,那么他们的程序可能会有细微的差异。有一些免费的反汇编器或调试器也可以在汇编中逐步完成。
除此之外,真的没有一种简单的方法可以找出这种事情。
我能想到的最可靠的方式类似于牛津词典中的“Esquivalience”一词。
只需在代码的某处添加一些具有唯一内容的二进制数组,不要忘记对其进行一些简单的使用,这样链接器就不会对其进行优化。您可能应该对它进行一些混淆,以便不经意的读者不会明显看出它是多余的。
然后用十六进制编辑器打开编译后的二进制文件并查找它。
为什么不使用nm查看符号表?
$ nm a.out
...