Домашняя » как » Магические числа Секретные коды, которые программисты скрывают на вашем компьютере

    Магические числа Секретные коды, которые программисты скрывают на вашем компьютере

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

    Какие магические числа?

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

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

    Скомпилированные файлы Java Class начинаются с CAFEBABE

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

    Когда приложение хочет вызвать функцию, оно может передать значения этой функции, используя стандартные типы, такие как целые числа, которые могут быть выражены в исходном коде в шестнадцатеричном формате. Это особенно верно для констант, которые являются идентификаторами, определенными с понятными для человека именами, такими как 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, но это не обязательно должно быть.

    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), используемый функцией 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..

    Замечания: не меняй ничего, пока смотришь. Шестнадцатеричные редакторы могут сломать вещи!