Wie erfolgt die magische Zahl von einer Binärdatei erhalten
-
23-09-2019 - |
Frage
Es ist eine magische Zahl mit jeder Binärdatei verbunden ist, Wer weiß, wie diese Informationen aus der Datei abrufen?
Lösung
Verwenden Sie libmagic von der Datei Paket, um zu versuchen und die Art der Datei erschnüffeln, wenn das Ihr Ziel ist.
Es gibt keine allgemeinen „magischen“ Zahlen in binären Dateien auf Unix, obwohl verschiedene Formate ihre eigenen definieren könnten. Die obige Bibliothek kennt viele von denen, und verwendet auch verschiedene andere Heuristiken und Figur aus dem Format / Dateityp zu versuchen.
Andere Tipps
file <file_name>
sind magische Zahlen in der Regel gespeichert in (Linux):
/usr/share/file/magic
überprüfen Sie auch diesen Link, jemand versucht libmagic zu verwenden, um die Informationen in C-Programm zu erhalten, könnte nützlich sein, wenn Sie schreiben etwas selbst.
Der Unix-Datei Befehl verwendet magische Zahl. finden Sie in der Datei Manpage mehr. (und wo die magische Datei zu finden)
Lesen Sie dieses: http://linux.die.net/man/5/magic
Es ist komplex und hängt von dem jeweiligen Dateityp Sie suchen.
Es gibt einen Datei Befehl, die wiederum eine magische Bibliothek verwendet, die Magie Bibliothek liest aus einer Datei in / etc genannt magic
gefunden (diese Installation abhängig und können variieren), die Details, welche die ersten paar Bytes der Datei sind und erzählt die file
welche Art von Datei es sich handelt, sei es, jpg, binär , Text, shell-Skript. Es gibt eine alte Version von libmagic gefunden auf Sourceforge. Im Übrigen gibt es eine ähnliche Antwort auf diese hier .
Hope, das hilft, Freundliche Grüße, Tom.
Darlegung auf @ nos Antwort:
Beispiel unten verwendet die Standard magische Datenbank die Datei auf der Befehlszeile übergeben abzufragen. (Im Wesentlichen eine Implementierung der Datei Befehl. Sehen Mann libmagic für weitere Informationen / Funktionen.
#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;
}
}