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 numerele secrete în interiorul PC-ului tău și le-au folosit pentru a negocia strângerea de mână secretă î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 utilizează 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.
Fișierele clasificate Java compilate încep cu CAFEBABEUtilitarul 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 folosind 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 valorile întregului real (sau alt tip). 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 ușor recunoscute deoarece 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 scriu ceva în limba engleză, altfel cunoscut sub numele de hexspeak.
Distracție cu numerele magice: unele exemple notabile
Fiecare AppleScript se termină cu FADEDEADDacă 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 codul 0x0B00B135 în codul sursă de suport al mașinii virtuale Hyper-V trimis la Linux, apoi au schimbat valoarea la 0xB16B00B5 și, în final, 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 crash iOS pentru a indica faptul că un jurnal este un stack of the entire system.
- 0xbad22222 - folosit de jurnalizarea de blocare a iOS pentru a indica faptul că o aplicație VoIP a fost ucisă de iOS pentru că a fost greșit.
- 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 crash iOS atunci când o aplicație este abandonată de un utilizator.
- 0xDEADD00D - folosit de Android pentru a indica o abatere VM.
- 0xDEAD10CC (Dead Lock) utilizat de jurnalizarea blocării iOS atunci când o aplicație blochează o resursă în fundal.
- 0xBAADF00D (Bad Food) folosit 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 boot normală sa întâmplat.
- 0x1BADB002 (1 boot rău) folosit de specificația multiboot ca număr magic
- 0xDEADDEAD - folosit 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. Mai știți de ce? Spuneți-ne în comentarii.
Văzând exemple pentru tine
Puteți vedea mai multe exemple prin deschiderea unui editor hex și apoi deschiderea oricăror 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 software-ul 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ă este citit în format ASCII.
Notă: nu merge nimic în timp ce te uiți în jur. Editorii Hex pot sparge lucrurile!