Od té doby, co první osoba napsala na kalkulačku číslo 5318008, skryli hlupáci ve vašem počítači tajná čísla a používali je k vyjednávání tajných potřesení rukou mezi aplikacemi a soubory. Dnes se krátce podíváme na některé ze zábavnějších příkladů.
Co jsou to magická čísla?
Většina programovacích jazyků používá 32bitový celočíselný typ k reprezentaci určitých typů dat v zákulisí - interně je číslo uloženo v RAM nebo použito CPU jako 32 jednotek a nul, ale ve zdrojovém kódu by bylo zapsáno buď běžný desítkový formát nebo hexadecimální formát, který používá čísla 0 až 9 a písmena A až F.
Když chce operační systém nebo aplikace určit typ souboru, může na začátku souboru vyhledat speciální značku, která označuje typ souboru. Například soubor PDF může začínat hexadecimální hodnotou 0x255044462D312E33, která se rovná „% PDF-1.3“ ve formátu ASCII, nebo soubor ZIP začíná 0x504B, což se rovná „PK“, která pochází z původního nástroje PKZip. Při pohledu na tento „podpis“ lze typ souboru snadno identifikovat i bez dalších metadat.
Linuxový „soubor“ lze z terminálu použít k určení typu souboru - ve skutečnosti čte magická čísla ze souboru zvané „magie“.
Když aplikace chce volat funkci, může předat hodnoty této funkci pomocí standardních typů, jako je celé číslo, které lze vyjádřit ve zdrojovém kódu v hexadecimálním formátu. To platí zejména pro konstanty, což jsou identifikátory definované lidsky čitelnými názvy, jako je AUTOSAVE_INTERVAL, ale mapují se na skutečné celočíselné (nebo jiné typy) hodnoty. Takže místo toho, aby programátor při každém volání funkce ve zdrojovém kódu vypisoval hodnotu jako 60, mohli pro lepší čitelnost použít konstantu AUTOSAVE_INTERVAL. (Konstanty jsou obvykle snadno rozpoznatelné, protože jsou psány velkými písmeny).
Všechny tyto příklady mohou spadat pod tento výraz Magická čísla , protože k tomu, aby funkce nebo typ souboru správně fungovaly, mohou vyžadovat konkrétní šestnáctkové číslo ... pokud hodnota není správná, nebude to fungovat. A když se programátor chce trochu pobavit, může tyto hodnoty definovat pomocí hexadecimálních čísel, která vysvětlují něco v angličtině, jinak známé jako hexspeak .
Zábava s magickými čísly: Některé pozoruhodné příklady
Pokud se rychle podíváte do zdrojového kódu Linuxu , uvidíte, že systémové volání _reboot () v systému Linux vyžaduje předání „magické“ proměnné, která se rovná hexadecimálnímu číslu 0xfee1dead. Pokud by se něco pokusilo tuto funkci zavolat, aniž by nejprve předalo magickou hodnotu, vrátilo by to chybu.
GUID (globálně jedinečný identifikátor) pro a Spouštěcí oddíl systému BIOS v Schéma rozdělení GPT je 21686148-6449-6E6F-744E-656564454649, který tvoří řetězec ASCII „Hah! IdontNeedEFI“, narážka na skutečnost, že GPT by se normálně používaly v počítače, které nahradily BIOS systémem UEFI , ale nemusí to nutně být.
Microsoft skvěle skryl 0x0B00B135 ve svém virtuálním stroji Hyper-V podporujícím zdrojový kód odeslaný do Linuxu změnili hodnotu na 0xB16B00B5 a nakonec oni přepnul na desítkové před úplným odstraněním ze zdrojového kódu.
Mezi zábavnější příklady patří:
- 0xbaaaaaad - používá Protokolování selhání systému iOS k označení, že protokol je souhrnem celého systému.
- 0xbad22222 - používá se při protokolování selhání systému iOS k označení, že aplikace VoIP byla iOS zabita, protože se chovala špatně.
- 0x8badf00d - (Ate Bad Food) používaný protokoly o selhání systému iOS k označení, že aplikaci trvalo příliš dlouho, než něco udělal, a byl zabit timeoutem watchdog.
- 0xdeadfa11 - (Dead Fall) použitý při protokolování selhání iOS, když je aplikace vynuceně ukončena uživatelem.
- 0xDEADD00D - používá Android k označení přerušení VM.
- 0xDEAD10CC (Dead Lock) používaný protokolováním selhání iOS, když aplikace uzamkne prostředek na pozadí.
- 0xBAADF00D (špatné jídlo) používané v LocalAlloc funkce ve Windows pro ladění.
- 0xCAFED00D (Cafe Dude) používaný kompresí Java200 v Javě.
- 0xCAFEBABE (Cafe babe) používaný Java jako identifikátor pro kompilované soubory tříd
- 0x0D15EA5E (Disease) používaný Nintendem na internetu Gamecube a Wii označující normální spuštění systému.
- 0x1BADB002 (1 špatné spuštění) používaný serverem multiboot specifikace jako magické číslo
- 0xDEADDEAD - používá Windows k označení a ručně zahájené selhání ladění , jinak známá jako Modrá obrazovka smrti.
Nejsou samozřejmě jediní, ale jen krátký seznam příkladů, které se zdály zábavné. Víš o něčem jiném? Řekněte nám to v komentářích.
Podívejte se na příklady sami
Další příklady můžete vidět otevřením hexadecimálního editoru a otevřením libovolného počtu typů souborů. Pro Windows, OS X nebo Linux je k dispozici spousta freewarových hexadecimálních editorů - jen při instalaci freeware buďte opatrní neinfikovat se crapwarem nebo spywarem.
Jako další příklad se obrázky pro obnovení pro telefony s Androidem, jako je ClockworkMod, začínají slovy „ANDROID!“ pokud jsou čteny ve formátu ASCII.
Poznámka: nedělejte nic, když se rozhlížíte kolem. Hex editori mohou věci rozbít!