24Aug
Seit die erste Person 5318008 auf einen Taschenrechner geschrieben hat, versteckten Nerds geheime Zahlen in Ihrem PC und nutzten sie, um geheime Handshakes zwischen Anwendungen und Dateien auszuhandeln. Heute werfen wir einen Blick auf einige der unterhaltsameren Beispiele.
Was sind magische Zahlen?
Die meisten Programmiersprachen verwenden einen 32-Bit-Integer-Typ, um bestimmte Arten von Daten hinter den Kulissen darzustellen - intern wird die Nummer im RAM gespeichert oder von der CPU als 32 Einsen und Nullen verwendet, aber im Quellcode würde sie ausgeschrieben werdenEntweder normales Dezimalformat oder als hexadezimales Format, das die Zahlen 0 bis 9 und die Buchstaben A bis F verwendet.
Wenn das Betriebssystem oder eine Anwendung den Typ einer Datei bestimmen möchte, kann sie zum Anfang der Datei schauenfür einen speziellen Marker, der den Typ der Datei angibt. Beispielsweise kann eine PDF-Datei mit dem Hexadezimalwert 0x255044462D312E33 beginnen, was "% PDF-1.3" im ASCII-Format entspricht, oder eine ZIP-Datei beginnt mit 0x504B, was "PK" entspricht und vom ursprünglichen PKZip-Dienstprogramm abstammt. Durch Betrachten dieser "Signatur" kann ein Dateityp ohne weitere Metadaten leicht identifiziert werden.
Das Linux-Dienstprogramm "Datei" kann vom Terminal aus verwendet werden, um den Typ einer Datei zu bestimmen - tatsächlich liest es die magischen Zahlen aus einer Datei namens "magic".
Wenn eine Anwendung es möchteUm eine Funktion aufzurufen, kann sie Werte an diese Funktion über Standardtypen wie Ganzzahl ü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 für Menschen lesbaren Namen wie AUTOSAVE_INTERVAL definiert sind, aber sie werden tatsächlichen Ganzzahlwerten( oder anderen Typen) zugeordnet. Anstelle eines Programmierers, der jedes Mal, wenn er die Funktion im Quellcode aufruft, einen Wert wie 60 eingibt, könnte er die AUTOSAVE_INTERVAL-Konstante für eine bessere Lesbarkeit verwenden.(Konstanten werden normalerweise leicht erkannt, weil 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 korrekt ist, funktioniert er nicht. Und wenn ein Programmierer ein wenig Spaß haben möchte, kann er diese Werte mit hexadezimalen Zahlen definieren, die etwas in Englisch buchstabieren, auch bekannt als Hexspeak.
Spaß mit magischen Zahlen: Einige bemerkenswerte Beispiele
Wenn Sie einen kurzen Blick in den Linux-Quellcode werfen, sehen Sie, dass der Systemaufruf _reboot() unter Linux eine "magische" Variable benötigt, die übergeben wirddas entspricht der Hexadezimalzahl 0xfee1dead. Wenn etwas versucht hat, diese Funktion aufzurufen, ohne zuerst diesen magischen Wert zu übergeben, würde es nur einen Fehler zurückgeben.
Die GUID( global eindeutige Kennung) für eine BIOS-Boot-Partition im GPT-Partitionierungsschema ist 21686148-6449-6E6F-744E-656564454649, die die ASCII-Zeichenfolge "Hah! IdontNeedEFI" bildet, eine Anspielung auf die Tatsache, dass GPT normalerweise wäreWird in Computern verwendet, die das BIOS durch UEFI ersetzt haben, muss dies aber nicht sein.
Microsoft versteckte 0x0B00B135 in seiner virtuellen Hyper-V-Maschine, die Quellcode für Linux unterstützte, und änderte dann den Wert in 0xB16B00B5. Schließlich wurde der Wert in dezimal geändert, bevor er vollständig aus dem Quellcode entfernt wurde.
Weitere lustige Beispiele sind:
- 0xbaaaaaad - Wird von der iOS-Absturzprotokollierung verwendet, 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 gekillt wurde, weil sie sich nicht ordnungsgemäß verhalten hat.
- 0x8badf00d -( Ate Bad Food), das von iOS-Absturzprotokollen verwendet wird, um anzuzeigen, dass eine Anwendung zu lange gedauert hat und durch das Watchdog-Timeout beendet wurde.
- 0xdeadfa11 -( Dead Fall), das von der iOS-Absturzprotokollierung verwendet wird, 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 dude) wird von der pack200-Komprimierung von Java verwendet.
- 0xCAFEBABE( Cafe babe) wird von Java als Bezeichner für kompilierte Klassendateien
- 0x0D15EA5E( Disease) verwendet, die von Nintendo auf dem Gamecube und der Wii verwendet werden, um anzuzeigen, dass ein normaler Boot-Vorgang stattgefunden hat.
- 0x1BADB002( 1 fehlerhafter Start), der von der Multiboot-Spezifikation als magische Zahl verwendet wird
- 0xDEADDEAD - Wird von Windows verwendet, um auf einen manuell initiierten Debug-Absturz hinzuweisen, der auch als Blue Screen of Death bekannt ist.
Natürlich sind das nicht die einzigen, aber nur eine kurze Liste von Beispielen, die Spaß gemacht haben. Kennen Sie noch mehr? Erzähl uns in den Kommentaren.
Beispiele für sich anzeigen
Sie können weitere Beispiele sehen, indem Sie einen Hex-Editor öffnen und dann eine beliebige Anzahl von Dateitypen öffnen. Es gibt viele Freeware-Hex-Editoren, die für Windows, OS X oder Linux verfügbar sind - stellen Sie jedoch sicher, dass Sie bei der Installation von Freeware vorsichtig sind, um nicht mit Crapware oder Spyware infiziert zu werden.
Als ein zusätzliches Beispiel beginnen Wiederherstellungsabbilder für Android-Handys wie ClockworkMod mit "ANDROID!", Wenn sie im ASCII-Format gelesen werden.
Hinweis: ändert nichts, während Sie sich umsehen. Hex-Editoren können Dinge brechen!