Магічні числа: секретні коди, які програмісти приховують на вашому комп'ютері

Відтоді, як перша людина написала 5318008 на калькуляторі, ботаніки приховували секретні числа всередині вашого ПК і використовували їх для узгодження секретних рукостискань між додатками і файлами. Сьогодні ми коротко розглянемо деякі з найцікавіших прикладів.

Що таке магічні числа?

Більшість мов програмування використовують 32-бітовий цілочисельний тип для представлення певних типів даних за лаштунками - внутрішнє число зберігається в ОЗП або використовується ЦП у вигляді 32 одиниць і нулів, але у вихідному коді воно буде записано або в звичайний десятковий формат або шістнадцятковий формат, в якому використовуються цифри від 0 до 9 і літери від A до F.


Коли операційна система або програма бажають визначити тип файлу, він може переглянути спеціальний маркер, який означає тип файлу. Наприклад, файл PDF може починатися з шістнадцяткового значення 0x255044462D312E33, що відповідає «% PDF-1.3» у форматі ASCII, або ZIP-файл починається з 0x504B, що відповідає «PK», що відбувається від оригінальної утиліти PKZip. Дивлячись на цей «підпис», тип файлу може бути легко ідентифікований навіть без будь-яких інших метаданих.

Утиліта Linux «file» може використовуватися з терміналу для визначення типу файлу - фактично, вона зчитує магічні числа з файлу, званого «magic».

Коли програма хоче викликати функцію, вона може передати значення цієї функції, використовуючи стандартні типи, такі як цілі числа, які можуть бути виражені у вихідному коді в шістнадцятковому форматі. Це особливо вірно для констант, які є ідентифікаторами, визначеними зі зрозумілими для людини іменами, такими як AUTOSAVE_INTERVAL, але вони зіставляються з дійсними цілочисельними (або іншими типами) значеннями. Тому замість того, щоб програміст друкував значення, наприклад, 60, кожен раз, коли він викликає функцію у вихідному коді, він міг би використовувати константу AUTOSAVE_INTERVAL для кращої читабельності. (Константи зазвичай легко розпізнаються, бо вони написані всіма великими літерами.)

Всі ці приклади можуть підпадати під термін «магічні числа», оскільки для правильної роботи функції або типу файлу може знадобитися певне шістнадцяткове число... якщо значення не є правильним, воно не працюватиме. І коли програміст хоче трохи повеселитися, він може визначити ці значення, використовуючи шістнадцяткові числа, які пишуть щось англійською мовою, інакше зване hexspeak.

Веселощі з чарівними числами: декілька яскравих прикладів

Якщо ви швидко подивитеся на початковий код Linux, то побачите, що системний виклик _ reboot () в Linux вимагає передачі «магічної» змінної, що дорівнює шістнадцятковому числу 0xfee1dead. Якщо хтось спробує викликати цю функцію, не передаючи спочатку це магічне значення, він просто поверне помилку.

GUID (глобально унікальний ідентифікатор) для завантажувального розділу BIOS у схемі розбиття GPT: 21686148-6449-6E6F-744E-656564454649, який формує рядок ASCII "Hah! IdontNeedEFI ", що вказує на те, що GPT зазвичай використовується на комп'ютерах, які замінили BIOS на UEFI, але це необов'язково.


Microsoft класно сховала 0x0B00B135 у своїй віртуальній машині Hyper-V, що підтримує вихідний код, представлений для Linux, потім вони змінили значення на 0xB16B00B5 і, нарешті, перемкнули його на десяткове, перш ніж воно було повністю видалено з вихідного коду.

Більш кумедні приклади включають в себе:

  • 0xbaaaaaad - використовується журналом аварійного завершення iOS, щоб вказати, що журнал є скловим сховищем всієї системи.
  • 0xbad22222 - використовується журналом збоїв iOS, щоб вказати, що додаток VoIP було вбито iOS через неправильну поведінку.
  • 0x8badf00d - (Ate Bad Food), який використовується журналами збоїв iOS для зазначення того, що додатку потрібно занадто багато часу, щоб щось зробити, і він був зупинений тайм-аутом сторожового таймера
  • 0xdeadfa11 - (Dead Fall) використовується журналом збоїв iOS, коли користувач примусово закриває програму.
  • 0xDEADD00D - використовується Android для позначення переривання роботи віртуальної машини.
  • 0xDEAD10CC (Dead Lock) використовується журналом збоїв iOS, коли програма блокує ресурс у фоновому режимі.
  • 0xBAADF00D (Bad Food), який використовується функцією LocalalAlloc у Windows для зневадження.
  • 0xCAFED00D (Cafe dude) використовується стисненням Java pack200.
  • 0xCAFEBABE (Cafe babe) використовується Java як ідентифікатор для зібраних файлів класів
  • 0x0D15EA5E (Хвороба), використовувана Nintendo в Gamecube і Wii для позначення нормального завантаження.
  • 0x1BADB002 (1 невдале завантаження) використовується специфікацією мультизавантаження як магічне число
  • 0xDEADDEAD - використовується Windows для індикації ініційованого вручну зневаджувального збою, також відомого як «синій екран смерті».

Звичайно, це не єдині приклади, а лише невеликий список прикладів, які здалися кумедними. Знаєш більше? Напишіть нам у коментарях.

Побачити приклади для себе

Ви можете побачити більше прикладів, відкривши шістнадцятковий редактор, а потім відкривши будь-яку кількість типів файлів. Існує безліч безкоштовних шістнадцяткових редакторів, доступних для Windows, OS X або Linux - просто переконайтеся, що ви обережні при установці безкоштовного програмного забезпечення, щоб не заразитися програмним забезпеченням або шпигунським ПЗ.

Як додатковий приклад, образи відновлення для телефонів Android, таких як ClockworkMod, починаються з «ANDROID!» При читанні у форматі ASCII.

Примітка: не міняйте нічого, поки дивіться навколо. Шістнадцяткові редактори можуть зламати речі!

COM_SPPAGEBUILDER_NO_ITEMS_FOUND