Magic Numbers Hemmeligheden koder, at programmører skjuler i din pc
Lige siden den første person skrev 5318008 på en regnemaskine, har nørder gemt hemmelige numre inde i din pc og brugt dem til at forhandle hemmelige håndtryk mellem applikationer og filer. I dag tager vi et kig på nogle af de mere underholdende eksempler.
Hvad er Magic Numbers?
De fleste programmeringssprog bruger en 32-bit heltalstype til at repræsentere visse typer data bag scenerne - internt lagres nummeret i RAM eller bruges af CPU'en som 32 og nuller, men i kildekoden vil den blive skrevet ud i enten 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 typen af en fil, kan den se til begyndelsen af filen til en særlig markør, der angiver filens type. For eksempel kan en PDF-fil starte med hex-værdien 0x255044462D312E33, som svarer til "% PDF-1.3" i ASCII-format, eller en ZIP-fil starter med 0x504B, hvilket svarer til "PK", som stammer fra det oprindelige PKZip-værktøj. Ved at se på denne "signatur" kan en filtype let identificeres, selv uden andre metadata.
Kompilerede Java Class-filer starter med CAFEBABELinux-hjælpeprogrammet "fil" kan bruges fra terminalen til at bestemme typen af en fil - faktisk læser den magiske tal fra en fil kaldet "magi".
Når et program ønsker at kalde en funktion, kan det passere 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 menneskelige læsbare navne som AUTOSAVE_INTERVAL, men de kortlægger til egentlige heltal (eller andre typer) værdier. Så i stedet for en programmør skrive en værdi som 60 hver gang de kalder funktionen i kildekoden, kunne de bruge AUTOSAVE_INTERVAL konstanten til bedre læsbarhed. (Konstanter er normalt let genkendt, fordi de er skrevet i alle store bogstaver).
Alle disse eksempler kan falde ind under udtrykket Magic Numbers, fordi de måske kræver et bestemt hexadecimalt tal for at en funktion eller filtype skal fungere korrekt ... hvis værdien ikke er korrekt, virker den ikke. Og når en programmør ønsker at have lidt sjov, kan de definere disse værdier ved hjælp af hexadecimale tal, der stave noget på engelsk, ellers kendt som hexspeak.
Sjov med magiske tal: Nogle bemærkelsesværdige eksempler
Hver AppleScript slutter med FADEDEADHvis du kigger hurtigt på Linux-kildekoden, ser du, at systemopkaldet _reboot () på Linux kræver en "magisk" variabel, der skal overføres, der svarer til det hexadecimale nummer 0xfee1dead. Hvis noget forsøgte at kalde den funktion uden at passere den magiske værdi først, ville det bare returnere en fejl.
GUID'en (globalt unik identifikator) til en BIOS-bootpartition i GPT-partitioneringsordningen er 21686148-6449-6E6F-744E-656564454649, som danner ASCII-streng "Hah! IdontNeedEFI", en henvisning til, at GPT normalt ville blive brugt i computere, der erstatter BIOS med UEFI, men det behøver ikke nødvendigvis at være.
Microsoft skjulte hidtil 0x0B00B135 i deres Hyper-V virtuelle maskine, der understøtter kildekoden, der blev sendt til Linux, og de ændrede værdien til 0xB16B00B5, og til sidst skiftede de den til decimal før den blev fjernet fra kildekoden helt.
Flere sjove eksempler er:
- 0xbaaaaaad - brugt af iOS crash logging for at angive, at en log er et stabshot af hele systemet.
- 0xbad22222 - bruges af iOS-crashlogging til at indikere, at en VoIP-app er blevet dræbt af iOS, fordi den misbrugte.
- 0x8badf00d - (Ate Bad Food), der bruges af iOS-crash-logfiler, for at angive, at en ansøgning tog for lang tid at gøre noget og blev dræbt af watchdog timeout.
- 0xdeadfa11 - (Dead Fall), der bruges af iOS-crashlogging, når en app er afbrudt af en bruger.
- 0xDEADD00D - bruges af Android til at angive en VM-abort.
- 0xDEAD10CC (Dead Lock), der bruges ved iOS-crashlogging, når et program låser en ressource i baggrunden.
- 0xBAADF00D (dårlig mad), der bruges af LocalAlloc-funktionen i Windows til debugging.
- 0xCAFED00D (Cafe dude), der bruges af Java's pack200 kompression.
- 0xCAFEBABE (Cafe babe), der bruges af Java som identifikator for sammensatte klassefiler
- 0x0D15EA5E (sygdom), der bruges af Nintendo på Gamecube og Wii for at indikere en normal opstart, skete.
- 0x1BADB002 (1 dårlig boot), der anvendes af multiboot-specifikationen som et magisk nummer
- 0xDEADDEAD - bruges af Windows til at angive et manuelt igangsat fejlsøgning, ellers kendt som Blue Screen of Death.
Disse er ikke de eneste derude, selvfølgelig, men bare en kort liste over eksempler, der syntes sjovt. Kender du 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 hvilket som helst antal filtyper. Der er masser af freeware hex redaktører tilgængelige til Windows, OS X eller Linux - bare sørg for at du er forsigtig, når du installerer freeware for ikke at blive smittet med crapware eller spyware.
Som et tilføjet eksempel starter genoprettelsesbilleder til Android-telefoner som ClockworkMod med "ANDROID!" Hvis de læses i ASCII-format.
Bemærk: Du må ikke ændre noget, mens du kigger rundt. Hex redaktører kan bryde ting!