Magic Numbers Die Geheimcodes, die Programmierer in Ihrem PC verstecken
Seit die erste Person 5318008 auf einem Taschenrechner geschrieben hat, verstecken Nerds geheime Zahlen in Ihrem PC und verwenden sie, um geheime Handshakes zwischen Anwendungen und Dateien auszuhandeln. Heute werfen wir einen kurzen Blick auf einige unterhaltsame Beispiele.
Was sind magische Zahlen??
Die meisten Programmiersprachen verwenden einen ganzzahligen 32-Bit-Typ, um bestimmte Datentypen hinter den Kulissen zu repräsentieren. Intern wird die Nummer im RAM gespeichert oder von der CPU als 32 Einsen und Nullen verwendet. Im Quellcode wird sie jedoch in beide geschrieben normales Dezimalformat oder als Hexadezimalformat, das die Zahlen 0 bis 9 und die Buchstaben A bis F verwendet.
Wenn das Betriebssystem oder eine Anwendung den Dateityp ermitteln möchte, kann es am Anfang der Datei nach einer speziellen Markierung suchen, die den Dateityp angibt. Eine PDF-Datei kann beispielsweise mit dem Hex-Wert 0x255044462D312E33 beginnen, der im ASCII-Format "% PDF-1.3" entspricht, oder eine ZIP-Datei beginnt mit 0x504B, was "PK" entspricht und vom ursprünglichen PKZip-Dienstprogramm abweicht. Durch das Betrachten dieser "Signatur" kann ein Dateityp auch ohne andere Metadaten leicht identifiziert werden.
Kompilierte Java Class-Dateien beginnen mit CAFEBABEDas Linux-Dienstprogramm "file" kann vom Terminal aus verwendet werden, um den Dateityp zu bestimmen. Tatsächlich liest es die magischen Zahlen aus einer Datei namens "magic".
Wenn eine Anwendung eine Funktion aufrufen möchte, kann sie mit Standardtypen wie Integer Werte an diese Funktion ü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 vom Menschen lesbaren Namen wie AUTOSAVE_INTERVAL definiert sind, jedoch den tatsächlichen Integer-Werten (oder einem anderen Typ) zugeordnet werden. Anstatt dass ein Programmierer bei jedem Aufruf der Funktion im Quellcode einen Wert wie 60 eingibt, könnte er zur besseren Lesbarkeit die Konstante AUTOSAVE_INTERVAL verwenden. (Konstanten sind in der Regel leicht zu erkennen, da sie in Großbuchstaben geschrieben sind.).
Alle diese Beispiele können unter dem Begriff "Magic Numbers" fallen, da sie möglicherweise eine bestimmte Hexadezimalzahl benötigen, damit eine Funktion oder ein Dateityp ordnungsgemäß funktioniert. Wenn der Wert nicht stimmt, 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 ausdrücken, was auch als Hexspeak bezeichnet wird.
Spaß mit magischen Zahlen: Einige bemerkenswerte Beispiele
Jedes AppleScript endet mit FADEDEADWenn Sie einen kurzen Blick auf den Linux-Quellcode werfen, werden Sie feststellen, dass der Systemaufruf _reboot () unter Linux erfordert, dass eine "magische" Variable übergeben wird, die der Hexadezimalzahl 0xfee1dead entspricht. Wenn etwas versucht hat, diese Funktion aufzurufen, ohne zuerst diesen magischen Wert zu übergeben, wird nur ein Fehler zurückgegeben.
Die GUID (Globally Unique Identifier) für eine BIOS-Boot-Partition im GPT-Partitionierungsschema lautet 21686148-6449-6E6F-744E-656564454649, die die ASCII-Zeichenfolge "Hah! IdontNeedEFI" bildet. Dies weist darauf hin, dass GPT normalerweise verwendet wird auf Computern, die das BIOS durch UEFI ersetzt haben, dies muss jedoch nicht unbedingt der Fall sein.
Microsoft versteckte bekannterweise 0x0B00B135 in ihrer virtuellen Hyper-V-Maschine, die Quellcode unterstützt, der an Linux übermittelt wurde. Anschließend wurde der Wert in 0xB16B00B5 geändert und schließlich auf Dezimalzahl umgestellt, bevor er vollständig aus dem Quellcode entfernt wurde.
Weitere lustige Beispiele sind:
- 0xbaaaaaad - Wird in der iOS-Absturzprotokollierung verwendet, um anzuzeigen, dass ein Protokoll eine Stapelaufnahme des gesamten Systems ist.
- 0xbad22222 - Wird von der iOS-Absturzprotokollierung verwendet, um anzuzeigen, dass eine VoIP-App von iOS beendet wurde, weil sie sich nicht ordnungsgemäß funktioniert.
- 0x8badf00d - (Ate Bad Food) wird von iOS-Absturzprotokollen verwendet, um anzuzeigen, dass eine Anwendung zu lange für etwas gebraucht hat und vom Watchdog-Timeout beendet wurde.
- 0xdeadfa11 - (Dead Fall) wird von der iOS-Absturzprotokollierung verwendet, wenn eine Anwendung von einem Benutzer zwangsweise beendet wird.
- 0xDEADD00D - Wird von Android verwendet, um einen VM-Abbruch anzuzeigen.
- 0xDEAD10CC (Dead Lock) wird von der iOS-Absturzprotokollierung verwendet, wenn eine Anwendung eine Ressource im Hintergrund sperrt.
- 0xBAADF00D (Bad Food) wird von der LocalAlloc-Funktion in Windows zum Debuggen verwendet.
- 0xCAFED00D (Cafe-Typ) wird von Javas Pack200-Komprimierung verwendet.
- 0xCAFEBABE (Cafe Babe) wird von Java als Bezeichner für kompilierte Klassendateien verwendet
- 0x0D15EA5E (Disease) wird von Nintendo auf dem Gamecube und der Wii verwendet, um anzuzeigen, dass ein normaler Startvorgang erfolgt ist.
- 0x1BADB002 (1 bad boot) wird von der Multiboot-Spezifikation als magische Zahl verwendet
- 0xDEADDEAD - Wird von Windows verwendet, um auf einen manuell initiierten Debug-Absturz hinzuweisen, der auch als Blue Screen of Death bezeichnet wird.
Dies sind natürlich nicht die einzigen, aber nur eine kurze Liste von Beispielen, die Spaß machten. Kennen Sie noch mehr? Sagen Sie uns in den Kommentaren.
Beispiele für sich selbst sehen
Sie können weitere Beispiele anzeigen, indem Sie einen Hex-Editor und dann eine beliebige Anzahl von Dateitypen öffnen. Es gibt zahlreiche Freeware-Hex-Editoren für Windows, OS X oder Linux. 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 Wiederherstellungs-Images für Android-Telefone wie ClockworkMod mit „ANDROID!“, Wenn sie im ASCII-Format gelesen werden.
Hinweis: ändern Sie nichts, während Sie sich umsehen. Hex-Editoren können Dinge zerstören!