Lige siden den første person skrev 5318008 ud på en lommeregner, har nørder gemt hemmelige numre inde på din pc og brugt dem til at forhandle hemmelige håndtryk mellem applikationer og filer. I dag ser vi hurtigt på nogle af de mere underholdende eksempler.
Hvad er magiske tal?
De fleste programmeringssprog bruger en 32-bit heltalstype til at repræsentere bestemte typer data bag kulisserne - internt gemmes nummeret i RAM eller bruges af CPU'en som 32 ener og nuller, men i kildekoden ville det blive skrevet ud i begge almindeligt decimalformat eller som hexadecimalt format, der bruger tallene 0 til 9 og bogstaverne A til F.
Når operativsystemet eller et program ønsker at bestemme filtypen, kan det se i starten af filen efter en særlig markør, der angiver filtypen. For eksempel kan en PDF-fil muligvis starte med hex-værdien 0x255044462D312E33, der svarer til "% PDF-1.3" i ASCII-format, eller en ZIP-fil starter med 0x504B, hvilket svarer til "PK", der stammer fra det originale PKZip-værktøj. Ved at se på denne "signatur" kan en filtype let identificeres, selv uden andre metadata.
Linux-filens "fil" kan bruges fra terminalen til at bestemme typen af en fil - faktisk den læser de magiske tal fra en fil kaldet "magi."
Når en applikation ønsker at kalde en funktion, kan den overføre værdier til den funktion ved hjælp af standardtyper som heltal, som kan udtrykkes i kildekoden i hexadecimalt format. Dette gælder især for konstanter, som er identifikatorer defineret med menneskeligt læsbare navne som AUTOSAVE_INTERVAL, men de kortlægges til faktiske heltal (eller anden type) værdier. Så i stedet for at en programmør indtaster en værdi som 60, hver gang de kalder funktionen i kildekoden, kan de bruge AUTOSAVE_INTERVAL-konstanten for bedre læsbarhed. (Konstanter genkendes normalt let, fordi de er skrevet med alle store bogstaver).
Alle disse eksempler kan falde ind under udtrykket Magiske numre , fordi de muligvis kræver et specifikt hexadecimalt tal for at en funktion eller filtype kan fungere korrekt ... hvis værdien ikke er korrekt, fungerer den ikke. Og når en programmør vil have det sjovt, kan de definere disse værdier ved hjælp af hexadecimale tal, der staver noget på engelsk, ellers kendt som hexspeak .
Sjov med magiske tal: Nogle bemærkelsesværdige eksempler
Hvis du kigger hurtigt ind i Linux-kildekoden , vil du se, at _reboot () systemopkaldet på Linux kræver, at der sendes en "magisk" variabel, der svarer til det hexadecimale tal 0xfee1dead. Hvis noget forsøgte at kalde den funktion uden først at videregive den magiske værdi, ville det bare returnere en fejl.
GUID (globalt unik identifikator) for en BIOS-startpartition i GPT-partitioneringsordning er 21686148-6449-6E6F-744E-656564454649, som danner ASCII-strengen "Hah! IdontNeedEFI", en hentydning til det faktum, at GPT normalt ville blive brugt i computere, der erstattede BIOS med UEFI , men det behøver ikke nødvendigvis at være det.
Microsoft berømt skjulte 0x0B00B135 i deres Hyper-V virtuelle maskinstøttende kildekode, der blev sendt til Linux, derefter de ændrede værdien til 0xB16B00B5 , og til sidst de skiftede det til decimal før den blev fjernet fra kildekoden helt.
Flere sjove eksempler inkluderer:
- 0xbaaaaaad - brugt af iOS crash logging for at angive, at en log er et stakbillede af hele systemet.
- 0xbad22222 - bruges af iOS crash logging til at indikere, at en VoIP-app er blevet dræbt af iOS, fordi den fejlagtigt opførte sig.
- 0x8badf00d - (Ate Bad Food) brugt af iOS crash logs for at indikere, at et program tog for lang tid at gøre noget og blev dræbt af vagthundens timeout.
- 0xdeadfa11 - (Dead Fall) bruges af iOS crash logging, når en app tvangsafsluttes af en bruger.
- 0xDEADD00D - bruges af Android til at angive, at en VM afbrydes.
- 0xDEAD10CC (Dead Lock) bruges af iOS crash logging, når en applikation låser en ressource i baggrunden.
- 0xBAADF00D (dårlig mad) brugt af LocalAlloc funktion i Windows til fejlfinding.
- 0xCAFED00D (Cafe dude) brugt af Java's pack200-komprimering.
- 0xCAFEBABE (Cafe babe) brugt af Java som identifikator for kompilerede klassefiler
- 0x0D15EA5E (sygdom) brugt af Nintendo på Gamecube og Wii for at indikere, at der opstod en normal opstart.
- 0x1BADB002 (1 dårlig opstart) brugt af multiboot specifikation som et magisk nummer
- 0xDEADDEAD - bruges af Windows til at angive en manuelt initieret fejlfindingsnedbrud , ellers kendt som Blue Screen of Death.
Disse er selvfølgelig ikke de eneste derude, men bare en kort liste over eksempler, der syntes sjove. Kender du til mere? Fortæl os i kommentarerne.
Se eksempler for dig selv
Du kan se flere eksempler ved at åbne en hex-editor og derefter åbne et vilkårligt antal filtyper. Der er masser af freeware hex-redaktører til rådighed til Windows, OS X eller Linux - bare sørg for at være forsigtig, når du installerer freeware for ikke at blive inficeret med crapware eller spyware.
Som et ekstra eksempel starter gendannelsesbilleder til Android-telefoner som ClockworkMod med "ANDROID!" hvis det læses i ASCII-format.
Bemærk: ikke ændre noget, mens du kigger rundt. Hex-redaktører kan bryde ting!