Odkąd pierwsza osoba zapisała na kalkulatorze 5318008, frajerzy ukrywali tajne liczby w twoim komputerze i używali ich do negocjowania tajnych uścisków dłoni między aplikacjami i plikami. Dzisiaj przyjrzymy się bliżej niektórym z bardziej zabawnych przykładów.
Co to 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 procesor jako 32 jedynki i zera, ale w kodzie źródłowym byłaby zapisana w albo zwykły format dziesiętny lub format szesnastkowy, który wykorzystuje cyfry od 0 do 9 oraz litery od A do F.
Gdy system operacyjny lub aplikacja chce określić typ pliku, może szukać na początku pliku specjalnego znacznika, który oznacza typ pliku. Na przykład plik PDF może zaczynać się od wartości szesnastkowej 0x255044462D312E33, która równa się „% PDF-1.3” w formacie ASCII, lub plik ZIP zaczyna się od 0x504B, co jest równe „PK”, co pochodzi od oryginalnego narzędzia PKZip. Patrząc na ten „podpis”, można łatwo zidentyfikować typ pliku, nawet bez innych metadanych.
Narzędzie Linux „file” może być użyte z terminala do określenia typu pliku - w rzeczywistości, to jest czyta magiczne liczby z pliku zwana „magią”.
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 można wyrazić w kodzie źródłowym w formacie szesnastkowym. Jest to szczególnie prawdziwe w przypadku stałych, które są identyfikatorami zdefiniowanymi za pomocą nazw czytelnych dla człowieka, takich jak AUTOSAVE_INTERVAL, ale są one mapowane na rzeczywiste wartości całkowite (lub innego typu). Więc zamiast wpisywania przez programistę wartości takiej jak 60 za każdym razem, gdy wywołuje funkcję w kodzie źródłowym, mógłby użyć stałej AUTOSAVE_INTERVAL dla lepszej czytelności. (Stałe są zwykle łatwe do rozpoznania, ponieważ są zapisane wielkimi literami).
Wszystkie te przykłady mogą być objęte tym terminem Magiczne liczby , ponieważ mogą wymagać określonej liczby szesnastkowej, aby funkcja lub typ pliku działały prawidłowo… jeśli wartość nie jest poprawna, nie zadziała. A kiedy programista chce się trochę zabawić, może zdefiniować te wartości za pomocą liczb szesnastkowych, które oznaczają coś w języku angielskim, znanym również jako szesnastkowy .
Zabawa z magicznymi liczbami: kilka godnych uwagi przykładów
Jeśli spojrzysz szybko do kodu źródłowego Linuksa , zobaczysz, że wywołanie systemowe _reboot () w Linuksie wymaga przekazania zmiennej „magicznej”, równej liczbie szesnastkowej 0xfee1dead. Gdyby coś próbowało wywołać tę funkcję bez wcześniejszego przekazywania tej magicznej wartości, po prostu zwróciłoby błąd.
Identyfikator GUID (unikatowy identyfikator globalny) dla Partycja rozruchowa systemu BIOS w Schemat partycjonowania GPT to 21686148-6449-6E6F-744E-656564454649, który tworzy ciąg ASCII „Hah! IdontNeedEFI”, co jest aluzją do faktu, że GPT byłby normalnie używany w komputery, które zastąpiły BIOS UEFI , ale niekoniecznie musi tak być.
Microsoft słynie ukrył 0x0B00B135 w ich wirtualnej maszynie Hyper-V obsługującej kod źródłowy przesłanej do systemu Linux zmienili wartość na 0xB16B00B5 i wreszcie oni zmieniłem go na dziesiętny zanim został całkowicie usunięty z kodu źródłowego.
Bardziej zabawne przykłady obejmują:
- 0xbaaaaaad - używany przez Rejestrowanie awarii iOS aby wskazać, że dziennik jest obrazem stosu całego systemu.
- 0xbad22222 - używany przez rejestrowanie awarii systemu iOS w celu wskazania, że aplikacja VoIP została zabita przez iOS, ponieważ źle się zachowała.
- 0x8badf00d - (Ate Bad Food) używane w dziennikach awarii iOS do wskazania, że aplikacja zajęła zbyt dużo czasu i została zabita przez przekroczenie limitu czasu watchdoga.
- 0xdeadfa11 - (Dead Fall) używane przez rejestrowanie awarii systemu iOS, gdy użytkownik wymusza zamknięcie aplikacji.
- 0xDEADD00D - używany przez Androida do wskazania przerwania pracy maszyny wirtualnej.
- 0xDEAD10CC (Dead Lock) używany przez rejestrowanie awarii systemu iOS, gdy aplikacja blokuje zasób w tle.
- 0xBAADF00D (złe jedzenie) używane przez LocalAlloc funkcja w systemie Windows do debugowania.
- 0xCAFED00D (Cafe dude) używany przez kompresję pack200 Javy.
- 0xCAFEBABE (Cafe babe) używany przez Javę jako identyfikator skompilowanych plików klas
- 0x0D15EA5E (choroba) używany przez Nintendo w Gamecube i Wii aby wskazać, że nastąpił normalny rozruch.
- 0x1BADB002 (1 zły rozruch) używany przez multiboot specyfikacja jako magiczna liczba
- 0xDEADDEAD - używany przez system Windows do wskazania pliku ręcznie zainicjowana awaria debugowania , inaczej nazywany niebieskim ekranem śmierci.
Nie są to oczywiście jedyne dostępne, ale tylko krótka lista przykładów, które wydawały się zabawne. Wiesz coś więcej? Powiedz nam w komentarzach.
Samodzielne dostrzeganie przykładów
Możesz zobaczyć więcej przykładów, otwierając edytor szesnastkowy, a następnie otwierając dowolną liczbę typów plików. Istnieje wiele darmowych edytorów szesnastkowych dostępnych dla systemu Windows, OS X lub Linux - po prostu upewnij się, że jesteś ostrożny podczas instalacji freeware aby nie zarazić się oprogramowaniem crapware lub spyware.
Jako dodatkowy przykład obrazy odzyskiwania dla telefonów z Androidem, takich jak ClockworkMod, zaczynają się od „ANDROID!” jeśli czytane w formacie ASCII.
Uwaga: nie zmieniaj niczego podczas rozglądania się. Edytory szesnastkowe mogą wszystko zepsuć!