11

每个二进制文件都有一个魔术数字,有人知道如何从文件中检索此信息吗?

4

6 回答 6

9
file <file_name>

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

/usr/share/file/magic

还要检查这个链接,有人试图使用 libmagic 来获取 C 程序中的信息,如果你自己写东西可能会很有用。

于 2010-01-27T14:21:02.850 回答
6

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

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

于 2010-01-27T14:21:46.993 回答
1

unix 文件命令使用幻数。有关更多信息,请参见文件手册页。(以及在哪里可以找到魔法文件)

于 2010-01-27T14:20:15.827 回答
1

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

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

于 2010-01-27T14:20:25.723 回答
1

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

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-27T14:21:29.837 回答
0

阐述@nos的答案:

下面的示例使用默认的魔术数据库来查询在命令行上传递的文件。(本质上是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;
    }

}
于 2019-04-30T19:26:59.073 回答