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