24Aug

Magic Numbers: Tajné kódy, ktoré programátori skrývajú vo vašom počítači

Odkedy prvý človek napísal 5318008 na kalkulačku, 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 v zdrojovom kóde by bolo napísané vbuď 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 pozrieť na začiatok súborupre špeciálnu značku, 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 súbor ZIP začína s 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 triedy začínajú s CAFEBABE

Pomô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 nazvaného "magic".

Keď aplikácia chcena vyvolanie funkcie, 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 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 rozpoznateľné, 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 fungoval správne. .. 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 čísiel, ktoré vyslovia niečo v angličtine, inak známe ako hexspeak.

Zábava s čarovnými číslami: Niektoré pozoruhodné príklady

Každý AppleScript končí s FADEDEAD

Ak sa rýchlo pozriete do zdrojového kódu systému Linux, zistíte, že volanie systému _reboot() v systéme Linux vyžaduje premennú "magickú" premennúto sa rovná hexadecimálnemu číslu 0xfee1dead. Ak sa niekto pokúsil nazývať túto funkciu bez toho, aby najskôr preniesol túto magickú hodnotu, vrátil by len 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 normálne bolpoužívané v počítačoch, ktoré nahradili systém BIOS systémom UEFI, ale nemusia byť nevyhnutne.

Spoločnosť Microsoft skvele ukryla 0x0B00B135 vo svojom podpornom zdrojovom kóde virtuálneho stroja Hyper-V, ktorý bol odoslaný na Linux, 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.

Ďalšie zábavné príklady zahŕňajú:

  • 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ý označuje, že aplikácia VoIP bola zabitá systémom iOS, pretože sa vyskytla chyba.
  • 0x8badf00d -( Ate Bad Food), ktorý používajú záznamy o zlyhaní systému iOS, ktoré naznačujú, že aplikácia trvala príliš dlho, aby niečo urobila a bola zabitá časom stráveným watchdogom.
  • 0xdeadfa11 -( Dead Fall) používaný pri zaznamenávaní zlyhania v systéme iOS pri zrušení aplikácie zo strany používateľa.
  • 0xDEADD00D - používa systém Android na indikáciu zrušenia VM.
  • 0xDEAD10CC( Dead Lock) používaný pri zaznamenávaní havárie v systéme iOS, keď aplikácia uzamkne zdroj na pozadí.
  • 0xBAADF00D( Bad Food) používaný funkciou LocalAlloc v systéme Windows na ladenie.
  • 0xCAFED00D( Cafe dude) používaný kompresiou pack200 v jazyku Java.
  • 0xCAFEBABE( Cafe babe) používa Java ako identifikátor pre kompilované triedy súborov
  • 0x0D15EA5E( Nemoc), ktoré Nintendo používa na GameCube a Wii na označenie normálnej bootovacej udalosti.
  • 0x1BADB002( 1 zlé zavedenie), ktoré používa špecifikácia pre spúšťanie ako čarové číslo
  • 0xDEADDEAD - používa systém Windows na označenie ručne spustených havárií, inak známy ako Blue Screen of Death.

Samozrejme to nie sú jediné, ale samozrejme len krátky zoznam príkladov, ktoré sa zdajú zábavné.Vedieť viac? Povedzte nám v komentároch.

Vidieť príklady pre seba

Viac príkladov 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 dostupných 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: nezmení nič, keď sa pozeráte.Šéfredaktori môžu rozdeliť veci!