24Aug

Magic Numbers: De geheime codes die programmeurs verbergen op uw pc

Sinds de eerste persoon 5318008 op een rekenmachine schreef, hebben nerds geheime nummers op je pc verborgen en deze gebruikt om te onderhandelen over geheime handshakes tussen applicaties en bestanden. Vandaag bekijken we een paar van de leukere voorbeelden.

Wat zijn magische nummers?

De meeste programmeertalen gebruiken een 32-bits integer type om bepaalde typen gegevens achter de schermen weer te geven - intern wordt het nummer opgeslagen in RAM of door de CPU gebruikt als 32 enen en nullen, maar in de broncode zou het worden uitgeschreven inofwel een reguliere decimale notatie, of als hexadecimale indeling, die de getallen 0 tot en met 9 en de letters A tot en met F gebruikt.

Wanneer het besturingssysteem of een toepassing het type van een bestand wil bepalen, kan deze naar het begin van het bestand kijkenvoor een speciale markering die het type van het bestand aangeeft. Een PDF-bestand kan bijvoorbeeld beginnen met de hexadecimale waarde 0x255044462D312E33, wat overeenkomt met "% PDF-1.3" in ASCII-indeling, of een ZIP-bestand begint met 0x504B, wat gelijk is aan "PK", die afstamt van het oorspronkelijke PKZip-hulpprogramma. Door naar deze 'handtekening' te kijken, kan een bestandstype gemakkelijk worden geïdentificeerd, zelfs zonder andere metadata.

Gecompileerde Java Class-bestanden beginnen met CAFEBABE

Het Linux-hulpprogramma "bestand" kan vanaf de terminal worden gebruikt om het type bestand te bepalen - in feite leest het de magische getallen uit een bestand met de naam "magic".

Wanneer een toepassing wilom een ​​functie aan te roepen, kan het waarden doorgeven aan die functie met behulp van standaardsoorten zoals integer, die kunnen worden uitgedrukt in de broncode in hexadecimale indeling. Dit geldt met name voor constanten, dat zijn identificatiegegevens die zijn gedefinieerd met door mensen leesbare namen zoals AUTOSAVE_INTERVAL, maar ze verwijzen naar werkelijke waarden voor geheel( of ander) type. Dus in plaats van dat een programmeur een waarde van 60 uittypt telkens wanneer deze de functie in de broncode aanroept, kunnen ze de constante AUTOSAVE_INTERVAL gebruiken voor een betere leesbaarheid.(Constanten worden meestal gemakkelijk herkend omdat ze in hoofdletters zijn geschreven).

Al deze voorbeelden kunnen vallen onder de term Magic Numbers, omdat ze een specifiek hexadecimaal getal kunnen hebben om een ​​functie of bestandstype correct te laten werken. .. als de waarde niet correct is, zal deze niet werken. En wanneer een programmeur een beetje plezier wil hebben, kunnen ze deze waarden definiëren met hexadecimale getallen die iets in het Engels spellen, ook wel hexspeak genoemd.

Plezier met magische nummers: enkele opmerkelijke voorbeelden

Elke AppleScript eindigt met FADEDEAD

Als je snel de Linux-broncode bekijkt, zul je zien dat de aanroep van het systeem _reboot() onder Linux vereist dat een "magische" variabele wordt doorgegevendat is gelijk aan het hexadecimale getal 0xfee1dead. Als iets probeerde die functie te bellen zonder eerst die magische waarde door te geven, zou er gewoon een fout terugkeren.

De GUID( globally unique identifier) ​​voor een BIOS-opstartpartitie in het GPT-partitioneringsschema is 21686148-6449-6E6F-744E-656564454649, die de ASCII-reeks "Hah! IdontNeedEFI" vormt, een toespeling op het feit dat GPT normaal gesprokengebruikt op computers die het BIOS met UEFI vervangen, maar dat hoeft niet per se te zijn.

Microsoft heeft 0x0B00B135 beroemd verborgen in hun Hyper-V virtueel-machine ondersteunende broncode ingediend bij Linux, vervolgens veranderden ze de waarde in 0xB16B00B5 en uiteindelijk schakelden ze over naar decimaal voordat het helemaal uit de broncode werd verwijderd.

Nog leukere voorbeelden zijn:

  • 0xbaaaaaad - gebruikt door iOS-crashregistratie om aan te geven dat een log een stackshot is van het hele systeem.
  • 0xbad22222 - gebruikt door iOS-crashregistratie om aan te geven dat een VoIP-app door iOS is vermoord omdat deze zich heeft misdragen.
  • 0x8badf00d -( Ate Bad Food) gebruikt door iOS-crashlogboeken om aan te geven dat een toepassing te lang heeft geduurd om iets te doen en werd gedood door de watchdog-time-out.
  • 0xdeadfa11 -( Dead Fall) gebruikt door iOS-crashregistratie wanneer een app geforceerd wordt afgesloten door een gebruiker.
  • 0xDEADD00D - gebruikt door Android om VM afbreken aan te geven.
  • 0xDEAD10CC( Dead Lock) gebruikt door iOS-crashregistratie wanneer een toepassing een resource op de achtergrond vergrendelt.
  • 0xBAADF00D( slecht voedsel) gebruikt door de LocalAlloc-functie in Windows voor foutopsporing.
  • 0xCAFED00D( Cafe-dude) gebruikt door de pack200-compressie van Java.
  • 0xCAFEBABE( Cafe Babe) gebruikt door Java als de ID voor gecompileerde klassebestanden
  • 0x0D15EA5E( ziekte) gebruikt door Nintendo op de Gamecube en Wii om aan te geven dat een normale opstart plaatsvond.
  • 0x1BADB002( 1 bad boot) gebruikt door de multiboot-specificatie als een magisch getal
  • 0xDEADDEAD - gebruikt door Windows om een ​​handmatig geïnitieerde debug-crash aan te geven, ook wel bekend als het Blue Screen of Death.

Dit zijn natuurlijk niet de enige, maar slechts een korte lijst met voorbeelden die leuk leken. Weet je nog meer? Vertel ons in de reacties.

Voorbeelden voor uzelf bekijken

U kunt meer voorbeelden zien door een hex-editor te openen en vervolgens een onbeperkt aantal bestandstypen te openen. Er zijn veel freeware hex-editors beschikbaar voor Windows, OS X of Linux - zorg er gewoon voor dat je voorzichtig bent bij het installeren van freeware om niet geïnfecteerd te raken met crapware of spyware.

Als een toegevoegd voorbeeld beginnen herstelbeelden voor Android-telefoons zoals ClockworkMod met "ANDROID!" Indien gelezen in ASCII-indeling.

Opmerking: verandert niets terwijl je rondkijkt. Hex-editors kunnen dingen breken!