如何获取二进制文件的幻数

时间:2010-01-27 14:15:50

标签: unix file-type magic-numbers

每个二进制文件都有一个幻数,是否有人知道如何从文件中检索此信息?

6 个答案:

答案 0 :(得分:8)

file <file_name>

幻数通常存储在(linux)中:

/usr/share/file/magic

还要查看此链接,有人试图使用libmagic来获取C程序中的信息,如果您自己写一些内容可能会有用。

答案 1 :(得分:6)

如果这是您的目标,请使用libmagic包中的file来尝试嗅出文件类型。

unix上的二进制文件中没有通用的“魔术”数字,但不同的格式可能会定义自己的。上面的库知道其中的许多,并使用各种其他启发式方法来尝试找出文件的格式/类型。

答案 2 :(得分:1)

unix file命令使用幻数。请参阅file man page了解更多信息。(以及查找魔术文件的位置)

答案 3 :(得分:1)

阅读本文:http://linux.die.net/man/5/magic

它很复杂,取决于您要查找的特定文件类型。

答案 4 :(得分:1)

有一个file命令反过来使用一个魔术库,魔术库从/ etc中找到的文件中读取magic(这取决于安装,可能会有所不同),详细说明了是文件的前几个字节,并告诉file它是什么类型的文件,是它,jpg,二进制文本,文本,shell脚本。在sourceforge上找到了一个旧版本的libmagic。顺便提一下,这个here有一个相关的答案。

希望这有帮助, 最好的祝福, 汤姆。

答案 5 :(得分:0)

@nos答案的解释:

下面的示例使用默认的magic数据库查询在命令行上传递的文件。 (本质上是 file 命令的实现。有关更多详细信息/功能,请参见 man libmagic

#include <iostream>
#include <magic.h>
#include <cassert>
int main(int argc, char **argv) {
    if (argc == 1) {
            std::cerr << "Usage "  << argv[0] << " [filename]" << std::endl;
            return -1;
    }
    const char * fname = argv[1];
    magic_t cookie = magic_open(0);
    assert (cookie !=nullptr);
    int rc = magic_load(cookie, nullptr);
    assert(rc == 0);
    auto f=  magic_file(cookie, fname);
    if (f ==nullptr) {
        std::cerr << magic_error(cookie) << std::endl;
    } else {
        std::cout << fname << ' ' << f << std::endl;
    }

}