24Aug

Numerele magice: Codurile secrete pe care programatorii le ascund în PC

De când prima persoană a scris 5318008 pe un calculator, tocilarii au ascuns numere secrete în interiorul PC-ului și le-au folosit pentru a negocia strângerea de mână între aplicații și fișiere. Astăzi, ne uităm la câteva exemple mai interesante.

Ce sunt numerele magice?

Cele mai multe limbi de programare folosesc un tip întreg de 32 de biți pentru a reprezenta anumite tipuri de date în spatele scenei - în interior numărul este stocat în RAM sau utilizat de CPU ca 32 și zerouri, dar în codul sursă ar fi scris înfie formatul zecimal obișnuit, fie ca format hexazecimal, care utilizează numerele de la 0 la 9 și literele A până la F.

Când sistemul de operare sau o aplicație dorește să determine tipul unui fișier, acesta poate privi la începutul fișieruluipentru un marker special care semnifică tipul fișierului. De exemplu, un fișier PDF poate începe cu valoarea hex 0x255044462D312E33, care este egală cu "% PDF-1.3" în format ASCII sau un fișier ZIP începe cu 0x504B, egal cu "PK", care coboară din utilitarul original PKZip. Privind această "semnătură", un tip de fișier poate fi ușor identificat chiar și fără alte metadate.

Fișierele Java clasificate încep cu CAFEBABE

Utilitarul Linux "fișier" poate fi folosit de la terminal pentru a determina tipul unui fișier - de fapt, citește numerele magice dintr-un fișier numit "magic".

Când o aplicație doreștepentru a apela o funcție, ea poate transmite valori acelei funcții utilizând tipuri standard ca întreg, care pot fi exprimate în codul sursă în format hexazecimal. Acest lucru este valabil mai ales pentru constantele, care sunt identificatori definiți cu nume care pot fi citite de om ca AUTOSAVE_INTERVAL, dar acestea sunt mapate la valori întregi reale( sau alte tipuri).Deci, în loc de un programator care scrie o valoare ca 60 de fiecare dată când apelează funcția din codul sursă, ei pot folosi constanta AUTOSAVE_INTERVAL pentru o mai bună citire.(Constantele sunt de obicei recunoscute cu ușurință pentru că sunt scrise cu majuscule).

Toate aceste exemple pot intra sub denumirea de Numere magice, deoarece ar putea necesita un anumit număr hexazecimal pentru ca o funcție sau un tip de fișier să funcționeze corect. .. dacă valoarea nu este corectă, nu va funcționa.Și când un programator dorește să se distreze puțin, ar putea defini aceste valori utilizând numerele hexazecimale care exprimă ceva în limba engleză, altfel cunoscut sub numele de hexspeak.

Distracție cu numere magice: câteva exemple notabile

Fiecare AppleScript se termină cu FADEDEAD

Dacă analizați rapid codul sursă Linux, veți vedea că apelul de sistem _reboot() pe Linux necesită o variabilă "magic"care este egal cu numărul hexazecimal 0xfee1dead. Dacă ceva a încercat să numească acea funcție fără să treacă mai întâi la acea valoare magică, s-ar întoarce o eroare.

GUID( identificator unic global) pentru o partiție de boot BIOS în schema de partiționare GPT este 21686148-6449-6E6F-744E-656564454649, care formează șirul ASCII "Hah! IdontNeedEFI", o aluzie la faptul că GPT ar fi în mod normalutilizat în computerele care au înlocuit BIOS-ul cu UEFI, dar nu trebuie neapărat să fie.

Microsoft a ascuns excelent 0x0B00B135 în codul sursă de suportare a mașinii virtuale Hyper-V trimis la Linux, apoi a schimbat valoarea la 0xB16B00B5 și, în final, a schimbat-o în zecimală înainte de a fi eliminată complet din codul sursă.

Mai multe exemple de distracție includ:

  • 0xbaaaaaad - folosit de jurnalizarea crash iOS pentru a indica faptul că un jurnal este un stack-uri întregului sistem.
  • 0xbad22222 - utilizat de jurnalizarea de blocare a iOS pentru a indica faptul că o aplicație VoIP a fost ucisă de iOS deoarece a fost incorectă.
  • 0x8badf00d -( Ate Bad Food) folosit de jurnalele de blocare iOS pentru a indica faptul că o aplicație a durat prea mult timp pentru a face ceva și a fost ucis de timpul de așteptare.
  • 0xdeadfa11 -( Dead Fall) folosit de jurnalizarea accidentului iOS când o aplicație este abandonată de un utilizator.
  • 0xDEADD00D - folosit de Android pentru a indica o abatere VM.
  • 0xDEAD10CC( Dead Lock) folosit de jurnalizarea blocării iOS atunci când o aplicație blochează o resursă în fundal.
  • 0xBAADF00D( Bad Food) utilizat de funcția LocalAlloc în Windows pentru depanare.
  • 0xCAFED00D( Cafe dude) utilizat de compresia pachetului Java200.
  • 0xCAFEBABE( Cafe babe) utilizat de Java ca identificator pentru fișierele de clasă compilate
  • 0x0D15EA5E( Boala) folosit de Nintendo pe GameCube și Wii pentru a indica o boot normală sa întâmplat.
  • 0x1BADB002( 1 boot rău) folosit de specificația multiboot ca număr magic
  • 0xDEADDEAD - utilizat de Windows pentru a indica un accident de depanare inițiat manual, altfel cunoscut sub numele de Ecran albastru al morții.

Acestea nu sunt singurele afară, desigur, ci doar o scurtă listă de exemple care păreau distractive.Știi mai multe? Spune-ne în comentarii.

Vezi exemple pentru tine

Puteți vedea mai multe exemple prin deschiderea unui editor hex și apoi prin deschiderea oricărui număr de tipuri de fișiere. Există o mulțime de editoare hexagonale gratuite disponibile pentru Windows, OS X sau Linux - asigurați-vă că aveți grijă atunci când instalați freeware pentru a nu fi infectat cu crapware sau spyware.

Ca un exemplu suplimentar, imaginile de recuperare pentru telefoane Android precum ClockworkMod încep cu "ANDROID!" Dacă sunt citite în format ASCII.

Notă: nu schimbă nimic în timp ce te uiți în jur. Editorii Hex pot sparge lucrurile!