Seit die erste Person 5318008 auf einem Taschenrechner geschrieben hat, verstecken Nerds Geheimnummern in Ihrem PC und verwenden sie, um geheime Handshakes zwischen Anwendungen und Dateien auszuhandeln. Heute werfen wir einen kurzen Blick auf einige der unterhaltsameren Beispiele.
Was sind magische Zahlen?
Die meisten Programmiersprachen verwenden einen 32-Bit-Integer-Typ, um bestimmte Datentypen hinter den Kulissen darzustellen. Intern wird die Nummer im RAM gespeichert oder von der CPU als 32 Einsen und Nullen verwendet, im Quellcode jedoch entweder reguläres Dezimalformat oder als hexadezimales Format, bei dem die Zahlen 0 bis 9 und die Buchstaben A bis F verwendet werden.
Wenn das Betriebssystem oder eine Anwendung den Dateityp bestimmen möchte, kann sie am Anfang der Datei nach einer speziellen Markierung suchen, die den Dateityp angibt. Beispielsweise kann eine PDF-Datei mit dem Hex-Wert 0x255044462D312E33 beginnen, der im ASCII-Format „% PDF-1.3“ entspricht, oder eine ZIP-Datei beginnt mit 0x504B, was „PK“ entspricht, das vom ursprünglichen PKZip-Dienstprogramm abgeleitet ist. Durch Betrachten dieser „Signatur“ kann ein Dateityp auch ohne andere Metadaten leicht identifiziert werden.
Das Linux-Dienstprogramm "Datei" kann vom Terminal aus verwendet werden, um den Dateityp zu bestimmen - tatsächlich liest die magischen Zahlen aus einer Datei genannt "Magie".
Wenn eine Anwendung eine Funktion aufrufen möchte, kann sie Werte an diese Funktion unter Verwendung von Standardtypen wie Integer übergeben, die im Quellcode im Hexadezimalformat ausgedrückt werden können. Dies gilt insbesondere für Konstanten, bei denen es sich um Bezeichner handelt, die mit lesbaren Namen wie AUTOSAVE_INTERVAL definiert sind, die jedoch tatsächlichen ganzzahligen (oder anderen Typ-) Werten zugeordnet sind. Anstatt dass ein Programmierer bei jedem Aufruf der Funktion im Quellcode einen Wert wie 60 eingibt, kann er zur besseren Lesbarkeit die Konstante AUTOSAVE_INTERVAL verwenden. (Konstanten sind normalerweise leicht zu erkennen, da sie in Großbuchstaben geschrieben sind.)
Alle diese Beispiele können unter den Begriff fallen Magische Zahlen , weil sie möglicherweise eine bestimmte Hexadezimalzahl benötigen, damit eine Funktion oder ein Dateityp ordnungsgemäß funktioniert. Wenn der Wert nicht korrekt ist, funktioniert er nicht. Und wenn ein Programmierer ein wenig Spaß haben möchte, kann er diese Werte mithilfe von Hexadezimalzahlen definieren, die etwas auf Englisch buchstabieren, auch bekannt als Hexspeak .
Spaß mit magischen Zahlen: Einige bemerkenswerte Beispiele
Wenn Sie einen kurzen Blick darauf werfen in den Linux-Quellcode Sie werden sehen, dass für den Systemaufruf _reboot () unter Linux eine "magische" Variable übergeben werden muss, die der Hexadezimalzahl 0xfee1dead entspricht. Wenn etwas versucht, diese Funktion aufzurufen, ohne zuerst diesen magischen Wert zu übergeben, wird nur ein Fehler zurückgegeben.
Die GUID (global eindeutige Kennung) für a BIOS boot partition in dem GPT-Partitionierungsschema ist 21686148-6449-6E6F-744E-656564454649, die die ASCII-Zeichenfolge "Hah! IdontNeedEFI" bildet, eine Anspielung auf die Tatsache, dass GPT normalerweise in verwendet wird Computer, die das BIOS durch UEFI ersetzt haben , aber es muss nicht unbedingt sein.
Microsoft berühmt versteckte 0x0B00B135 in ihrer virtuellen Hyper-V-Maschine, die den an Linux gesendeten Quellcode unterstützt Sie haben den Wert in 0xB16B00B5 geändert und schließlich sie schaltete es auf dezimal bevor es vollständig aus dem Quellcode entfernt wurde.
Weitere lustige Beispiele sind:
- 0xbaaaaaad - verwendet von iOS-Absturzprotokollierung um anzuzeigen, dass ein Protokoll ein Stackshot des gesamten Systems ist.
- 0xbad22222 - Wird von der iOS-Absturzprotokollierung verwendet, um anzuzeigen, dass eine VoIP-App von iOS beendet wurde, weil sie sich schlecht benommen hat.
- 0x8badf00d - (Ate Bad Food) wird von iOS-Absturzprotokollen verwendet, um anzuzeigen, dass eine Anwendung zu lange gebraucht hat und durch das Watchdog-Timeout beendet wurde.
- 0xdeadfa11 - (Dead Fall) wird von der iOS-Absturzprotokollierung verwendet, wenn eine App von einem Benutzer zwangsweise beendet wird.
- 0xDEADD00D - Wird von Android verwendet, um einen VM-Abbruch anzuzeigen.
- 0xDEAD10CC (Dead Lock), das von der iOS-Absturzprotokollierung verwendet wird, wenn eine Anwendung eine Ressource im Hintergrund sperrt.
- 0xBAADF00D (Bad Food) verwendet von der LocalAlloc Funktion in Windows zum Debuggen.
- 0xCAFED00D (Cafe Dude), der von der Java Pack200-Komprimierung verwendet wird.
- 0xCAFEBABE (Cafe babe) wird von Java als Kennung für kompilierte Klassendateien verwendet
- 0x0D15EA5E (Krankheit) von Nintendo auf der Gamecube und Wii um anzuzeigen, dass ein normaler Start stattgefunden hat.
- 0x1BADB002 (1 fehlerhafter Start), der von der Multiboot Spezifikation als magische Zahl
- 0xDEADDEAD - wird von Windows verwendet, um a anzugeben manuell initiierter Debug-Absturz , auch bekannt als Blue Screen of Death.
Dies sind natürlich nicht die einzigen da draußen, sondern nur eine kurze Liste von Beispielen, die Spaß gemacht haben. Wissen Sie noch mehr? Sag es uns in den Kommentaren.
Beispiele für sich selbst sehen
Sie können weitere Beispiele anzeigen, indem Sie einen Hex-Editor und anschließend eine beliebige Anzahl von Dateitypen öffnen. Es gibt viele Freeware-Hex-Editoren für Windows, OS X oder Linux - nur Stellen Sie sicher, dass Sie bei der Installation von Freeware vorsichtig sind um nicht mit Crapware oder Spyware infiziert zu werden.
Als zusätzliches Beispiel beginnen Wiederherstellungsimages für Android-Telefone wie ClockworkMod mit "ANDROID!" wenn im ASCII-Format gelesen.
Hinweis: Ändern Sie nichts, während Sie sich umschauen. Hex-Editoren können Dinge kaputt machen!