Magic Numbers Таємні коди, які програмісти ховають у вашому комп'ютері
З тих пір, як перша особа виписала 5318008 на калькуляторі, ботаніки ховали секретні числа всередині вашого ПК і використовували їх для обговорення секретних рукостискань між програмами та файлами. Сьогодні ми швидко розглянемо деякі з найбільш цікавих прикладів.
Що таке магічні цифри?
Більшість мов програмування використовують 32-бітний цілочисельний тип для представлення певних типів даних за лаштунками - внутрішнє число зберігається в оперативній пам'яті або використовується процесором як 32 одиниці та нулі, але в вихідному коді його буде виписано в звичайний десятковий формат, або у вигляді шістнадцяткового формату, який використовує цифри від 0 до 9 і літери від A до F.
Коли операційна система або програма хочуть визначити тип файлу, він може перейти до початку файлу для спеціального маркера, який позначає тип файлу. Наприклад, файл PDF може починатися з шестнадцатеричного значення 0x255044462D312E33, що дорівнює "% PDF-1.3" у форматі ASCII, або ZIP-файл починається з 0x504B, що дорівнює "PK", що походить від оригінальної утиліти PKZip. Розглядаючи цей «підпис», тип файлу можна легко ідентифікувати навіть без будь-яких інших метаданих.
Скомпільовані файли класу Java починаються з CAFEBABE«Файл» утиліти Linux може бути використаний з терміналу для визначення типу файлу - насправді він читає магічні числа з файлу, який називається «магія».
Коли програма бажає викликати функцію, вона може передавати значення цій функції, використовуючи стандартні типи, такі як ціле, які можуть бути виражені у вихідному коді у шістнадцятковому форматі. Це особливо вірно для констант, які є ідентифікаторами, визначеними з іменами, що читаються людиною, наприклад AUTOSAVE_INTERVAL, але вони відображаються у фактичні цілі (або інші типи) значення. Таким чином, замість того, щоб програміст набирав значення 60, кожен раз, коли вони викликають функцію в вихідному коді, вони могли б використовувати константа AUTOSAVE_INTERVAL для кращої читаності. (Зазвичай константи легко розпізнаються, оскільки вони написані великими літерами).
Всі ці приклади можуть підпадати під термін Магічні цифри, оскільки вони можуть вимагати певного шістнадцяткового числа для того, щоб функція або тип файлу працювали належним чином ... якщо значення не є правильним, воно не працюватиме. А коли програміст хоче трохи розважитися, вони можуть визначити ці значення, використовуючи шістнадцяткові числа, які викладають англійською мовою, інакше відомі як hexspeak.
Веселощі з магічними числами: деякі помітні приклади
Кожен AppleScript закінчується FADEDEADЯкщо ви швидко подивитеся на вихідний код Linux, ви побачите, що системний виклик _reboot () на Linux вимагає передачі “магічної” змінної, що дорівнює шістнадцятковому номеру 0xfee1dead. Якщо щось спробував викликати цю функцію, не спочатку перейшовши в цю магічну величину, це просто поверне помилку.
GUID (глобальний унікальний ідентифікатор) для завантажувального розділу BIOS у схемі розділення GPT є 21686148-6449-6E6F-744E-656564454649, який утворює рядок ASCII “Hah! IdontNeedEFI”, натяк на те, що GPT зазвичай буде використовуватися на комп'ютерах, які замінили BIOS на UEFI, але це не обов'язково.
Майкрософт відомо сховав 0x0B00B135 у своїй віртуальній машині Hyper-V, що підтримує вихідний код, представлений на Linux, потім змінив значення на 0xB16B00B5, і, нарешті, перевели його в десяткову до того, як він повністю видалився з вихідного коду.
Додаткові цікаві приклади:
- 0xbaaaaaad - використовується реєстрацією збоїв iOS, щоб вказати, що журнал є стопшотком всієї системи.
- 0xbad22222 - використовується журналом краху iOS для вказівки, що додаток VoIP було вбито iOS, оскільки воно неправильно.
- 0x8badf00d - (з'їв погану їжу), використовуваний журналами аварійного завершення роботи iOS, щоб вказати, що програма займає занадто багато часу, щоб щось зробити, і було вбито тайм-аутом сторожового таймера.
- 0xdeadfa11 - (Мертве падіння), яке використовується під час реєстрації аварійних операцій iOS, коли користувач примушує користувача вийти.
- 0xDEADD00D - використовується Android для позначення переривання віртуальної машини.
- 0xDEAD10CC (Dead Lock), використовуваний журналом краху iOS, коли програма блокує ресурс у фоновому режимі.
- 0xBAADF00D (Погана їжа), яка використовується функцією LocalAlloc у Windows для налагодження.
- 0xCAFED00D (Cafe dude), використовуваний стисненням пакету Java200.
- 0xCAFEBABE (Cafe babe), що використовується Java як ідентифікатор для скомпільованих файлів класів
- 0x0D15EA5E (хвороба), що використовується Nintendo на Gamecube і Wii для позначення нормального завантаження.
- 0x1BADB002 (1 неправильне завантаження), що використовується специфікацією мультизавантаження як магічне число
- 0xDEADDEAD - використовується Windows для вказівки ручного ініціювання аварійного виходу з ладу, інакше відомого як Синій екран смерті.
Це не єдині там, звичайно, але тільки короткий список прикладів що здавався утіха. Знати більше? Розкажіть нам у коментарях.
Побачення прикладів для себе
Ви можете побачити більше прикладів, відкривши шестнадцятковий редактор і відкривши будь-яку кількість типів файлів. Є багато безкоштовних шестнадцатеричних редакторів, доступних для Windows, OS X або Linux - просто переконайтеся, що ви обережні при установці безкоштовного програмного забезпечення, щоб не заразитися crapware або spyware.
Як додатковий приклад, зображення для відновлення для телефонів Android, наприклад ClockworkMod, починаються з “ANDROID!”, Якщо вони читаються у форматі ASCII..
Примітка: не йдіть, нічого не змінюючи, поки ви дивитеся навколо. Шістнадцяткові редактори можуть розбивати речі!