If-Koubou

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

Numerele magice: Codurile secrete pe care programatorii le ascund în PC (Cum să)

De când prima persoană a scris 5318008 pe un calculator, tocilarii au ascuns numerele 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?

Majoritatea limbajelor de programare folosesc un număr î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 în formatul zecimal obișnuit sau 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șierului 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.

Fisierele clasificate Java compilate incep cu CAFEBABE

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

Atunci când o aplicație dorește să apeleze 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 folosind numerele hexazecimale care exprimă ceva în limba engleză, altfel cunoscut sub numele de hexspeak.

Distracție cu numere magice: unele 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 să fie transmisă, 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-ul ar fi utilizat în mod normal î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 cele din urmă au schimbat-o în zecimală înainte de a fi eliminată complet din codul sursă.

Mai multe exemple de distracție includ:

  • 0xbaaaaaad - folosit de jurnalizarea de blocare iOS pentru a indica faptul că un jurnal este un stack-uri întregului sistem.
  • 0xbad22222 - folosit de jurnalizarea cu jet de 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 atunci când o aplicație este abandonată de un utilizator.
  • 0xDEADD00D - utilizat de Android pentru a indica o abatere VM.
  • 0xDEAD10CC (Dead Lock) utilizat de jurnalizarea accidentului 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) folosit de compresia pachetului Java200.
  • 0xCAFEBABE (Cafe babe) folosit de Java ca identificator pentru fișierele de clasă compilate
  • 0x0D15EA5E (Boala) folosită de Nintendo pe GameCube și Wii pentru a indica o încărcare normală.
  • 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.

Văzând exemple pentru dvs.

Puteți vedea mai multe exemple deschizând un editor hex și apoi deschizând orice 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 mergi să schimbi nimic în timp ce te uiți în jur. Editorii Hex pot sparge lucrurile!