Magické čísla Tajné kódy, ktoré programátori skrývajú vo vašom počítači
Odkedy prvý človek napísal 5318008 na kalkulačke, hlupáci skrývajú tajné čísla vnútri počítača a používajú ich na vyjednávanie tajných handshakes medzi aplikáciami a súbormi. Dnes sa pozrieme na niekoľko zábavnejších príkladov.
Čo sú čarovné čísla?
Väčšina programovacích jazykov používa 32-bitový celočíselný typ na reprezentovanie určitých typov údajov v zákulisí - interne je číslo uložené v pamäti RAM alebo použité procesorom ako 32 jednotiek a núl, ale vo zdrojovom kóde by to bolo napísané buď normálny desatinný formát alebo ako hexadecimálny formát, ktorý používa čísla 0 až 9 a písmená A až F.
Keď operačný systém alebo aplikácia chce určiť typ súboru, môže sa na začiatok súboru pozrieť na špeciálny značkovač, ktorý označuje typ súboru. Napríklad súbor PDF môže začínať hexadecimálnou hodnotou 0x255044462D312E33, ktorá sa rovná "% PDF-1.3" vo formáte ASCII, alebo ZIP súbor začína 0x504B, čo sa rovná "PK", ktorý sa sťahuje z pôvodného pomôcky PKZip. Pri pohľade na tento "podpis" môže byť typ súboru ľahko identifikovateľný aj bez ďalších metadát.
Kompilované súbory Java Class začínajú CAFEBABEPomôcka Linux "súbor" môže byť použitá z terminálu na určenie typu súboru - v skutočnosti číta magické čísla zo súboru s názvom "magic".
Keď aplikácia chce zavolať funkciu, môže preniesť hodnoty na túto funkciu pomocou štandardných typov ako celé číslo, ktoré môžu byť vyjadrené v zdrojovom kóde v šestnástkovom formáte. Platí to najmä pre konštanty, ktoré sú identifikátory definované s názvami, ktoré sú čitateľné pre človeka, ako napríklad AUTOSAVE_INTERVAL, ale mapujú sa na skutočné hodnoty celočíselného (alebo iného typu). Takže namiesto toho, aby programátor napísal hodnotu 60, zakaždým, keď volá funkciu vo zdrojovom kóde, mohli by používať konštantu AUTOSAVE_INTERVAL pre lepšiu čitateľnosť. (Konštanty sú zvyčajne ľahko rozpoznané, pretože sú napísané všetkými veľkými písmenami).
Všetky tieto príklady môžu spadať pod termín Magic Numbers, pretože môžu vyžadovať špecifické hexadecimálne číslo, aby funkcia alebo typ súboru správne fungoval ... ak hodnota nie je správna, nebude to fungovať. A keď programátor chce mať trochu zábavy, môžu definovať tieto hodnoty pomocou hexadecimálnych čísel, ktoré vysvetľujú niečo v angličtine, inak známe ako hexspeak.
Zábava s čarovnými číslami: niektoré pozoruhodné príklady
Každý AppleScript končí FADEDEADAk sa rýchlo pozriete do zdrojového kódu systému Linux, uvidíte, že systémový volanie _reboot () v systéme Linux vyžaduje premennú "magic", ktorá sa rovná hexadecimálnemu číslu 0xfee1dead. Ak sa niekto pokúsil nazývať túto funkciu bez toho, aby najprv prešiel touto magickou hodnotou, vrátil by chybu.
GUID (globálne jedinečný identifikátor) pre zavádzací oddiel BIOS v systéme rozdelenia GPT je 21686148-6449-6E6F-744E-656564454649, ktorý tvorí ASCII reťazec "Hah! IdontNeedEFI", narážka na skutočnosť, že GPT by sa bežne používal v počítačoch, ktoré nahradili systém BIOS systémom UEFI, ale nemusia byť nevyhnutne.
Microsoft skvele ukryl 0x0B00B135 vo svojom virtuálnom stroji Hyper-V podporujúcom zdrojový kód odoslaný do Linuxu, potom zmenili hodnotu na hodnotu 0xB16B00B5 a nakoniec ju zmenili na desatinnú hodnotu predtým, ako bola úplne odstránená zo zdrojového kódu.
Medzi ďalšie zábavnejšie príklady patrí:
- 0xbaaaaaad - používa sa pri zaznamenávaní havárie v systéme iOS, že log je stack of the whole system.
- 0xbad22222 - používaný protokolom o zlyhaní iOS, ktorý naznačuje, že aplikácia VoIP bola zabitá systémom iOS, pretože bola nesprávne.
- 0x8badf00d - (Ate Bad Food), ktorý používajú záznamy o zlyhaní iOS, ktoré naznačujú, že aplikácia trvala príliš dlho, aby niečo urobila a bola zabitá časom watchdog.
- 0xdeadfa11 - (Dead Fall), ktorý sa používa pri zaznamenávaní zlyhania v systéme iOS pri zrušení aplikácie používateľom.
- 0xDEADD00D - používa Android na označenie zrušenia VM.
- 0xDEAD10CC (Dead Lock), ktorý používa protokol havárie v systéme iOS, keď aplikácia uzamkne zdroj na pozadí.
- 0xBAADF00D (zlé jedlo), ktoré používa funkcia LocalAlloc v systéme Windows na ladenie.
- 0xCAFED00D (Cafe dude) používa kompresia pack200 v jazyku Java.
- 0xCAFEBABE (Cafe babe) používa Java ako identifikátor pre kompilované súbory triedy
- 0x0D15EA5E (choroba) používaná Nintendom na Gamecube a Wii na označenie normálnej boot.
- 0x1BADB002 (1 zlé zavedenie), ktoré používa špecifikácia pre spustenie viacerých operačných systémov ako magické číslo
- 0xDEADDEAD - používa systém Windows na označenie ručne spustených havárií, inak známy ako Blue Screen of Death.
Nie sú to samozrejme jediné, samozrejme, ale len krátky zoznam príkladov, ktoré sa zdajú zábavné. Už viete viac? Povedzte nám v komentároch.
Vidieť príklady pre seba
Ďalšie príklady môžete vidieť otvorením hexadecimálneho editora a otvorením ľubovoľného počtu typov súborov. Existuje veľa freeware hex editorov pre Windows, OS X alebo Linux - len sa uistite, že ste opatrní pri inštalácii freeware, aby sa nedostali nakazený crapware alebo spyware.
Ako ďalší príklad, obnovenie obrázkov pre telefóny s Androidom, ako je ClockworkMod, začína s "ANDROID!" Ak je čítané vo formáte ASCII.
Poznámka: počas jazdy nezmeníte nič. Hex editori môžu rozdeliť veci!