【问题标题】:Why do file formats have magic numbers?为什么文件格式有幻数?
【发布时间】:2010-10-01 17:17:45
【问题描述】:

比如Portable Executable有好几个,包括大名鼎鼎的“MZ”开头,还有PE头开头的“PE\0\0”。 Rar 文件格式有“Rar!” header 开头,其他几个在文件中有类似的“魔法值”。

这些神奇的价值有什么作用?

【问题讨论】:

    标签: file-format


    【解决方案1】:

    由于用户更改文件扩展名,或其他程序窃取文件扩展名,它允许应用程序取消对未知格式文件的处理,而不是尽力而为,然后无论如何都失败了。

    【讨论】:

    • 如果它无论如何都会失败,那它为什么需要检测坏幻数呢?如果文件格式不同,则文件的其他部分可能没有意义。
    • @Billy - 对于某些文件格式,您不一定能判断数据是否“坏”。例如,如果没有幻数,就很难以编程方式确定文件是否为位图。
    • 此外,您将无法区分已知格式的损坏文件和未知格式的(可能)有效文件。
    • 比利:一点也不真实。我曾经编写代码来自动检测和加载某些特定科学数据的 7 或 8 种文件类型之一。那些没有幻数的格式几乎是不可能的,因为许多格式足够灵活,格式 X 中的某些东西实际上也是有效的格式 Y。最后,我将它加载到两者中并查看实际数据集,看看哪个更有意义。 (例如,如果在格式 X 中,数据类型标记指示“与以前的数据相比变化百分比”,并且 所有 读数都高于 1000%,则可能是其他格式。)一般来说,虽然,这是不可能的。
    • @Billy:在发生故障之前的处理过程可能非常昂贵。您提到了 rar ,它是一种存档格式。让我们想想其他一些归档格式,比如 gzip。它们是流式传输的,因此您无法对文件进行第一遍检查以查看一切是否合理,您必须在第一遍输出。输出可能是硬盘(甚至更慢的存储介质),并且您可能会在失败之前写入数 GB 的“解压缩”输出。防止这种情况的唯一方法是某种内部一致性检查。最好的可能是用魔术字节初始化的 CRC。
    【解决方案2】:

    幻数的概念可以追溯到 unix 并且早于文件扩展名的使用。 shell 最初的想法是所有的“可执行文件”看起来都是一样的——文件是如何创建的或者应该使用什么程序来评估它并不重要。 shell 将查看文件的内容并确定适当的文件。微软出现并选择了不同的方法,文件扩展的时代诞生了。然后,为了让用户感觉“更好”,微软选择“隐藏”这些扩展名,木马文件的时代诞生了,这些文件看起来是一种类型,但实际上具有不同的扩展名并由不同的文件处理。

    【讨论】:

      【解决方案3】:

      如果两个应用程序以不同的方式存储数据,但其构造使得其中一个应用程序的文件也可能是另一个应用程序的有效(但无意义)文件,则可能会发生非常糟糕的事情。一个程序可能认为它已经成功加载了文件(不知道数据是无意义的),然后写回一个在语义上相同的文件,但写入它的应用程序(或其他任何东西)将不再有意义地读取该文件就此而言)。

      使用幻数并不能完全避免这种情况,但至少可以有所帮助。

      顺便说一句,试图猜测数据的格式通常是非常危险的。例如,假设有一个可能是日期的列表,格式为 nn-nn-nn。如果不知道日期的格式,可能有足够的信息可以很好地猜测格式(例如,如果其中一条记录是 12-31-99,那么缺少相反的信息,日期可能是 mm -dd-yy) 但如果所有日期都在一个月的前 12 天内,则数据很容易被误解。但是,假设数据前面有“MM-DD-YY”。这样就可以减少误解的风险。

      【讨论】:

        【解决方案4】:

        快速识别文件的类型,或其中的位置。

        【讨论】:

          【解决方案5】:

          你的问题不应该是“为什么文件格式有幻数”,而应该是“文件格式有幻数有什么好处”!

          建议:

          • 通过读取磁盘可用空间来取消删除文件的程序可能会识别文件类型
          • 您的 UNIX 知道可执行文件是被解释 (she-bang) 还是二进制文件
          • 当您丢失扩展名时,file 等程序可以检测您的文件是什么
          • 文件格式设计者认为,当应用程序可以轻松确保它们正在读取具有良好格式的文件时,它总是更安全。
          • 由于您有一个标头,因此将其放在标头开始处不会花费太多。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-17
            • 2013-04-06
            • 2021-02-17
            • 2011-03-22
            • 1970-01-01
            • 2020-10-13
            • 1970-01-01
            • 2011-10-18
            相关资源
            最近更新 更多