我可以识别程序的源计算机吗?

信息安全 匿名
2021-08-22 03:41:27

我正在开发多个平台和语言的程序,但我不希望任何人发现开发该程序的原始计算机,有什么办法可以发现吗?

3个回答

源代码包含在一堆文本文件中。文本文件的内容正是文本编辑器显示的内容,因此您可以“直观地”控制它。当心诸如 CVS 或 Subversion之类的修订控制$Id$系统:它们会自动将源代码中的某些特定标签(例如“ ”)替换为可能包含当前日期和时间、您的登录名和其他信息的识别字符串——该功能被认为有利于可追溯性,但我知道在您的特定情况下您不会喜欢它。

编译后的代码完全是另一回事。一些编译器可能会自动添加识别字符串,就像版本控制软件所做的那样,作为可执行结构中的“注释”字段。这甚至不需要是故意的间谍设备:在一般情况下,可追溯性确实是一个好主意;没有必要想象政府贿赂编译器开发人员在编译器中添加这些东西只是为了能够监视程序员。此外,可执行格式通常包括一些“空白”——出于对齐原因而添加的未使用部分——编译器可能不会费心填充零,而不仅仅是在那个地方写入 RAM 中的内容。旧版本的lcc-win32会发生这种情况可能包含机密信息(我认为这已为 lcc-win32 修复,但它可能发生在其他工具集上)。

其他文件格式也可以嵌入(并因此泄漏)一些信息。例如,PNG 图像可以包含“评论”(不会以任何方式改变图片的视觉效果)。GIMP是一个图像处理程序,它使用注释字段来说明它参与了图像处理;任何工具还可以添加一些您认为不太友好的信息。

通过将文件视为文本,可以直观地检测到许多潜在的泄漏。但这并不包括您的一个工具被自愿窃听的可能性,因此它在其输出中包含有罪的证据(此类跟踪信息将被加密,以便“看起来随机”,除了知道在哪里查看的人)。

不幸的是,对于整个世界的状况来说,“我国的一场革命”并不是一个非常准确的指示。目前有不少国家发生武装叛乱或类似骚乱,包括但不限于阿富汗、也门、叙利亚、索马里、利比亚部分地区、哥伦比亚、苏丹、南撒哈拉;埃及、伊拉克或伊朗的情况并不完全清楚,仅包括我能从记忆中想到的少数几个。

有一门专门用于从计算机文件和系统中提取信息的学科:计算机取证

计算机文件相对容易匿名。相对于网络流量而言,即:文件只是一堆比特,而网络流量通过时间来承载大量信息。在绝对范围内,重要文件的匿名性通常不是那么容易实现的。

首先要确保源文件中没有识别信息,除了注释。注释大多是安全的,尽管它们确实会影响可能出现在调试信息中的行号(例如__LINE__,在 C 中)。特别是,正如Tom 所说,请确保您的源文件没有 RCS 标记等。对函数、变量、类、源文件等使用非常通用的名称,因为其中许多都进入了可执行文件。

由于不同的编译器以不同的方式编译和优化普通代码,因此有足够积极性的审查员可以以良好的成功率识别您的编译器。因此,请确保使用非常通用的编译器。这同样适用于您的程序链接到的任何库。

然后,做一些基本的测试。在具有相同编译器版本的多台机器上编译相同的程序,并确保结果逐位相同。如果机器除了编译器和库之外尽可能不同(不同的操作系统版本、不同的用户名、不同的语言设置……),那么测试将更具决定性。

在 unix 系统(例如 Linux 或 Windows 下的 Cygwin)下,strings在二进制文件上运行命令以查找可打印的子字符串。这只是一个基本的健全性检查,无论如何它都不会找到所有潜在的犯罪信息。例如,它不会在多字节字符集中找到字符串编码,例如 UTF-16(由 Windows 和 Java 使用)。

如果可能,请尝试将您的程序与不会引发任何标志的看似无辜的程序和包含敏感数据的小文本文件分开。通过不同的渠道分发两者。更好的是,安排让你的程序成为一个小文本文件;理想情况下,使用流行的解释语言并且只分发程序源。但是,不要分发您自己的工作源:分发没有注释、敏感变量名称等的已清理源。

当您分发您的程序时,您可能决定使用诸如 zip 或 tar 之类的存档格式。请注意,这些存档存储文件的日期,并且某些存档格式(例如 tar)可以存储用户名。

虽然没有完全匿名这样的东西,但我认为对于单人编程工作来说,实现足够好的匿名是可能的。您最大的担心将是分配。当您移动字节时,要保持匿名要困难得多,一旦您开始与人互动,就更难了。使用Tor会有所帮助,但它不是灵丹妙药,尤其是对付拥有政府资源的拦截器。

(特别是,这个问题可以追溯到您!特别是如果您居住的国家/地区对所有 Internet 访问都有政府过滤器,这可以将您的 Internet 活动与有关您与 Stack Exchange 交互的公共信息相关联。)

我不知道有人可以通过任何方式追溯您在哪台计算机上编写程序或在哪台程序上编译它。

但是,如果您想更安全,一种可能性可能是购买对其他系统(例如,Amazon EC2 或虚拟私有托管服务)上计算资源的访问权,并在那里编译您的程序。我还会“剥离”二进制文件,以删除所有调试符号,以防万一。如果您能够以无法追溯到您的方式获得访问权限,那么即使有一些疯狂的方法可以识别编译它的计算机,也无法直接链接回您的身份。也许这里的人们可以建议一种在某些机器上获得远程 shell 访问(或运行虚拟机)的方法,而无需透露您的身份。