С тех пор, как первый человек выписал 5318008 на калькуляторе, ботаники скрывали секретные числа внутри вашего ПК и использовали их для согласования секретных рукопожатий между приложениями и файлами. Сегодня мы кратко рассмотрим некоторые из наиболее интересных примеров.
Что такое магические числа?
Большинство языков программирования используют 32-битный целочисленный тип для представления определенных типов данных за кулисами - внутри число хранится в ОЗУ или используется ЦП как 32 единицы и нули, но в исходном коде оно будет записано либо в в обычном десятичном формате или в шестнадцатеричном формате, в котором используются числа от 0 до 9 и буквы от A до F.
Когда операционная система или приложение хочет определить тип файла, они могут искать в начале файла специальный маркер, обозначающий тип файла. Например, файл PDF может начинаться с шестнадцатеричного значения 0x255044462D312E33, что соответствует «% PDF-1.3» в формате ASCII, или файл ZIP начинается с 0x504B, что соответствует «PK», происходящему от исходной утилиты PKZip. Глядя на эту «подпись», можно легко определить тип файла даже без каких-либо других метаданных.
Утилиту Linux «файл» можно использовать из терминала для определения типа файла - фактически, это читает магические числа из файла называется «магия».
Когда приложение хочет вызвать функцию, оно может передавать значения этой функции, используя стандартные типы, такие как целое число, которые могут быть выражены в исходном коде в шестнадцатеричном формате. Это особенно верно для констант, которые представляют собой идентификаторы, определенные с удобочитаемыми именами, такими как 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 (Плохая еда), используемый LocalAlloc функция в Windows для отладки.
- 0xCAFED00D (чувак из кафе), используемый Java-сжатием pack200.
- 0xCAFEBABE (Cafe babe), используемый Java в качестве идентификатора для скомпилированных файлов классов
- 0x0D15EA5E (болезнь), используемый Nintendo на Gamecube и Wii чтобы указать, что произошла нормальная загрузка.
- 0x1BADB002 (1 плохая загрузка), используемый мультизагрузка спецификация как магическое число
- 0xDEADDEAD - используется Windows для обозначения вручную инициированный сбой отладки , иначе известный как Синий экран смерти.
Это, конечно, не единственные, но лишь краткий список примеров, которые показались забавными. Знаете что-нибудь еще? Напишите нам в комментариях.
Увидеть примеры для себя
Вы можете увидеть больше примеров, открыв шестнадцатеричный редактор, а затем открыв любое количество типов файлов. Существует множество бесплатных шестнадцатеричных редакторов, доступных для Windows, OS X или Linux - просто будьте осторожны при установке бесплатного программного обеспечения чтобы не заразиться вредоносным или шпионским ПО.
В качестве дополнительного примера, образы восстановления для телефонов Android, таких как ClockworkMod, начинаются с «ANDROID!» если читать в формате ASCII.
Примечание: ничего не меняйте, пока смотрите по сторонам. Редакторы Hex могут сломать вещи!