Начална » как да » Магически числа Тайните кодове, които програмистите скриват във вашия компютър

    Магически числа Тайните кодове, които програмистите скриват във вашия компютър

    Откакто първият човек е написал 5318008 на калкулатор, маниаците крият тайни номера във вашия компютър и ги използват за договаряне на тайни ръкостискания между приложения и файлове. Днес ще разгледаме някои от най-интересните примери.

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

    Повечето езици за програмиране използват 32-битов цялостен тип за представяне на определени типове данни зад кулисите - вътрешно номерът се съхранява в RAM или се използва от CPU като 32 единици и нули, но в изходния код той ще бъде изписан в редовен десетичен формат, или като шестнадесетичен формат, който използва числата от 0 до 9 и буквите от A до F.

    Когато операционната система или приложението иска да определи типа на файла, той може да потърси в началото на файла специален маркер, който обозначава типа на файла. Например, един PDF файл може да започне с шестнадесетичната стойност 0x255044462D312E33, която е равна на "% PDF-1.3" в ASCII формат, или ZIP файл започва с 0x504B, което е равно на "PK", което е от оригиналната PKZip помощна програма. Разглеждайки този „подпис“, типът на файла може лесно да бъде идентифициран дори без други метаданни.

    Съставените Java Class файлове започват с CAFEBABE

    Linux файлът може да се използва от терминала, за да се определи вида на файла - всъщност той чете магическите числа от файл, наречен "магия".

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

    Всички тези примери могат да попаднат под термина магически числа, защото те могат да изискват определен шестнадесетичен номер, за да може дадена функция или тип файл да работи правилно ... ако стойността не е правилна, няма да работи. И когато програмист иска да се забавлява малко, те могат да дефинират тези стойности с шестнадесетични числа, които изписват нещо на английски, иначе известен като hexspeak.

    Забава с магически числа: Някои забележителни примери

    Всеки AppleScript завършва с FADEDEAD

    Ако погледнете бързо в изходния код на Linux, ще видите, че системният разговор на _reboot () на Linux изисква да се премине „магическа“ променлива, която е равна на шестнадесетичното число 0xfee1dead. Ако нещо се опита да извика тази функция, без първо да премине тази магическа стойност, просто щеше да върне грешка.

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

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

    Още забавни примери включват:

    • 0xbaaaaaad - използва се от регистрирането на сривовете на iOS, за да покаже, че дневникът е стакшот на цялата система.
    • 0xbad22222 - използва се от регистрирането на сривовете на iOS, за да покаже, че VoIP приложението е било убито от iOS, защото е неправилно.
    • 0x8badf00d - (изяждане на лоша храна), използвано от регистрите за сривове на iOS, за да покаже, че дадено приложение отнема твърде много време, за да направи нещо и е било убито от изчакване на наблюдателя.
    • 0xdeadfa11 - (Dead Fall), използвано от регистрирането на сривовете на iOS, когато приложението е задействано от потребителя.
    • 0xDEADD00D - използва се от Android за означаване на прекъсване на VM.
    • 0xDEAD10CC (Dead Lock), използвано от регистрирането на сривовете на iOS, когато дадено приложение заключва ресурс във фонов режим.
    • 0xBAADF00D (лоша храна), използвана от функцията LocalAlloc в Windows за отстраняване на грешки.
    • 0xCAFED00D (Cafe dude), използван от компресията на Java на pack200.
    • 0xCAFEBABE (Cafe babe), използван от Java като идентификатор за компилирани класови файлове
    • 0x0D15EA5E (Заболяване), използвано от Nintendo в Gamecube и Wii, за да покаже, че се е случило нормално зареждане.
    • 0x1BADB002 (1 лошо зареждане), използвано от спецификацията за много операционна система като магическо число
    • 0xDEADDEAD - използва се от Windows за показване на ръчно стартирания срив при отстраняване на грешки, иначе известен като Синият екран на смъртта.

    Това не са единствените там, разбира се, а само кратък списък с примери, които изглеждаха забавни. Знаеш ли повече? Кажете ни в коментарите.

    Виждайки примери за себе си

    Можете да видите повече примери, като отворите шестнадесетичен редактор и след това отворите произволен брой файлови типове. Има много безплатни шестнадесетични редактори за Windows, OS X или Linux - просто се уверете, че сте внимателни, когато инсталирате безплатна програма, за да не се заразите с crapware или spyware.

    Като допълнителен пример, изображенията за възстановяване за Android телефони като ClockworkMod започват с „ANDROID!“, Ако се четат в ASCII формат.

    Забележка: не се променяй нищо, докато се оглеждаш. Hex редакторите могат да нарушат нещата!