If-Koubou

Magic Numbers: tajne kody, które programista ukrywa na swoim komputerze

Magic Numbers: tajne kody, które programista ukrywa na swoim komputerze (Jak)

Odkąd pierwsza osoba wypisała 5318008 na kalkulatorze, nerdy ukrywały tajne numery wewnątrz komputera i używały ich do negocjowania tajnych uścisków dłoni pomiędzy aplikacjami i plikami. Dzisiaj rzucimy okiem na niektóre z bardziej zabawnych przykładów.

Czym są numery magiczne?

Większość języków programowania używa 32-bitowego typu całkowitego do reprezentowania pewnych typów danych za kulisami - wewnętrznie liczba jest przechowywana w pamięci RAM lub używana przez CPU jako 32 zer i jedynek, ale w kodzie źródłowym byłaby zapisana albo w zwykły format dziesiętny lub w formacie szesnastkowym, który używa cyfr od 0 do 9 i liter od A do F.

Gdy system operacyjny lub aplikacja chce określić typ pliku, może on odszukać na początku pliku specjalny znacznik, który oznacza typ pliku. Na przykład plik PDF może zaczynać się od wartości szesnastkowej 0x255044462D312E33, która jest równa "% PDF-1.3" w formacie ASCII, lub plik ZIP zaczyna się od 0x504B, co równa się "PK", która pochodzi z oryginalnego narzędzia PKZip. Patrząc na ten "podpis", typ pliku można łatwo zidentyfikować, nawet bez żadnych innych metadanych.

Skompilowane pliki klas Java zaczynają się od CAFEBABE

Narzędzie "plik" Linuxa może być używane z terminala do określenia typu pliku - w rzeczywistości odczytuje magiczne liczby z pliku o nazwie "magia".

Gdy aplikacja chce wywołać funkcję, może przekazywać wartości do tej funkcji przy użyciu standardowych typów, takich jak liczba całkowita, które mogą być wyrażone w kodzie źródłowym w formacie szesnastkowym. Dotyczy to w szczególności stałych, które są identyfikatorami zdefiniowanymi za pomocą nazw czytelnych dla człowieka, takich jak AUTOSAVE_INTERVAL, ale mapują one do rzeczywistych wartości całkowitych (lub innego typu). Zamiast więc programista wypisuje wartość taką jak 60 za każdym razem, gdy wywoła funkcję w kodzie źródłowym, mogliby użyć stałej AUTOSAVE_INTERVAL dla lepszej czytelności. (Stałe są zwykle łatwo rozpoznawane, ponieważ są napisane dużymi literami).

Wszystkie te przykłady mogą należeć do terminu Magiczne liczby, ponieważ mogą wymagać określonej liczby szesnastkowej, aby funkcja lub typ pliku działał prawidłowo ... jeśli wartość nie jest prawidłowa, nie będzie działać. A kiedy programista chce się trochę zabawić, może zdefiniować te wartości za pomocą liczb szesnastkowych, które opisują coś po angielsku, znanego też jako hexspeak.

Zabawa z magicznymi liczbami: niektóre godne uwagi przykłady

Każdy AppleScript kończy się FADEDEAD

Jeśli spojrzysz szybko na kod źródłowy Linuksa, zobaczysz, że wywołanie systemowe _reboot () w systemie Linux wymaga podania "magicznej" zmiennej, która jest równa liczbie szesnastkowej 0xfee1dead. Jeśli coś próbowało wywołać tę funkcję, nie przekazując najpierw tej wartości magicznej, po prostu zwróciłoby błąd.

Identyfikator GUID (globalnie unikalny identyfikator) dla partycji rozruchowej systemu BIOS w schemacie partycjonowania GPT to 21686148-6449-6E6F-744E-656564454649, który tworzy ciąg znaków ASCII "Hah! IdontNeedEFI", co jest aluzją do faktu, że GPT byłby normalnie używany w komputerach, które zastąpiły BIOS z UEFI, ale niekoniecznie muszą.

Microsoft słynne ukrywał 0x0B00B135 w swojej wirtualnej maszynie Hyper-V obsługującej kod źródłowy przesłany do systemu Linux, następnie zmienił wartość na 0xB16B00B5 i ostatecznie zamienił ją na dziesiętną, zanim została całkowicie usunięta z kodu źródłowego.

Więcej zabawnych przykładów to:

  • 0xbaaaaaad - używany w dzienniku awarii systemu iOS, aby wskazać, że dziennik jest stackshotem całego systemu.
  • 0xbad22222 - używane przez logowanie awarii systemu iOS, aby wskazać, że aplikacja VoIP została zabita przez iOS, ponieważ źle się zachowywała.
  • 0x8badf00d - (Złe jedzenie) używane przez dzienniki awarii systemu iOS, aby wskazać, że aplikacja wykonała zbyt długo i została zabita przez przekroczenie limitu czasu watchdoga.
  • 0xdeadfa11 - (Dead Fall) używane przez logowanie awarii systemu iOS, gdy aplikacja zostanie wymuszona przez użytkownika.
  • 0xDEADD00D - używany przez system Android do sygnalizowania przerwania maszyny wirtualnej.
  • 0xDEAD10CC (Dead Lock) używane przez logowanie awarii systemu iOS, gdy aplikacja blokuje zasób w tle.
  • 0xBAADF00D (Złe jedzenie) używane przez funkcję LocalAlloc w Windows do debugowania.
  • 0xCAFED00D (Cafe dude) używany w kompresji Java pack200.
  • 0xCAFEBABE (Cafe babe) używana przez Javę jako identyfikator skompilowanych plików klas
  • 0x0D15EA5E (Disease) używane przez Nintendo na Gamecube i Wii do wskazania normalnego startu.
  • 0x1BADB002 (1 zły rozruch) używany przez specyfikację multiboota jako magiczna liczba
  • 0xDEADDEAD - używany przez system Windows, aby wskazać awarię debugowania zainicjowaną ręcznie, zwaną inaczej Niebieskim ekranem śmierci.

Oczywiście nie są to jedyne, ale tylko krótka lista przykładów, które wydawały się zabawne. Wiesz więcej? Powiedz nam w komentarzach.

Zobacz przykłady dla siebie

Możesz zobaczyć więcej przykładów, otwierając edytor heksadecymalny, a następnie otwierając dowolną liczbę typów plików. Istnieje wiele darmowych edytorów szesnastkowych dostępnych dla systemów Windows, OS X lub Linux - po prostu upewnij się, że instalujesz oprogramowanie freeware, aby nie zarazić się crapware lub spyware.

Jako dodatkowy przykład, obrazy odzyskiwania dla telefonów z Androidem, takie jak ClockworkMod, zaczynają się od "ANDROID!", Jeśli są czytane w formacie ASCII.

Uwaga: nie zmieniaj niczego, gdy się rozglądasz. Redaktorzy heksadecy mogą łamać rzeczy!