Magic Numbers - tajne kody ukryte przez programistów na twoim komputerze
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ą magiczne liczby?
Większość języków programowania używa 32-bitowych liczb całkowitych 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 regularny format dziesiętny lub w formacie heksadecymalnym, który używa cyfr od 0 do 9 oraz 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 CAFEBABENarzędzie Linux "plik" 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, może użyć stałej AUTOSAVE_INTERVAL dla lepszej czytelności. (Stałe są zwykle łatwo rozpoznawane, ponieważ są napisane wielkimi literami).
Wszystkie te przykłady można zaklasyfikować jako "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, inaczej zwanego hexspeak.
Zabawa z magicznymi liczbami: niektóre godne uwagi przykłady
Każdy AppleScript kończy się FADEDEADJeś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 ktoś próbowałby wywołać tę funkcję, nie przekazując najpierw tej wartości magicznej, po prostu zwróciłby 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", aluzja do faktu, że GPT byłby normalnie używany w komputerach, które zastąpiły BIOS-em UEFI, ale niekoniecznie muszą.
Microsoft słynie z ukrytej nazwy 0x0B00B135 w swojej wirtualnej maszynie Hyper-V obsługującej kod źródłowy przesłany do systemu Linux, a następnie zmienił wartość na 0xB16B00B5, i ostatecznie zmienił 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ę zachowuje.
- 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 (Bad Food) 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żywanego 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 zostać zainfekowanym przez oprogramowanie typu 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 heksadecymalni mogą łamać rzeczy!