If-Koubou

Magic Numbers: Тайните кодове, които програмистите скриват във вашия компютър

Magic Numbers: Тайните кодове, които програмистите скриват във вашия компютър (Как да)

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

Какви са магическите номера?

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

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

Компилираните файлове от Java клас започват с CAFEBABE

Помощната програма "Linux" на Linux може да се използва от терминала за определяне на вида на файла - всъщност той чете магически номера от файл, наречен "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, за да покаже, че дневникът е stackshot на цялата система.
  • 0xbad22222 - използва се от регистрирането на катастрофи на iOS, за да покаже, че VoIP приложение е било загинато от iOS, тъй като е било неправилно.
  • 0x8badf00d - (Ate Bad Food), използвана от регистрационните файлове за сривове на iOS, за да покаже, че дадено приложение отне много време, за да направи нещо и е било убито от часовника.
  • 0xdeadfa11 - (Dead Fall), използван при регистриране на катастрофи на iOS, когато едно приложение е напусната от даден потребител.
  • 0xDEADD00D - използвано от Android за обозначаване на отказ от VM.
  • 0xDEAD10CC (Dead Lock), използван при регистриране на катастрофи на iOS, когато дадено приложение заключи ресурс във фонов режим.
  • 0xBAADF00D (лоша храна), използвана от функцията LocalAlloc в Windows за отстраняване на грешки.
  • 0xCAFED00D (Cafe пич), използван от компресията на pack200 в Java.
  • 0xCAFEBABE (Cafe babe), използвана от Java като идентификатор за компилираните класови файлове
  • 0x0D15EA5E (Болест), използван от Nintendo на Gamecube и Wii, за да покаже, че се случи нормално зареждане.
  • 0x1BADB002 (1 лошо зареждане), използвано от спецификацията за зареждане като зареждане като магическо число
  • 0xDEADDEAD - използвано от Windows за индикация на ръчно накарана катастрофа за отстраняване на грешки, известна още като Синия екран на смъртта.

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

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

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

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

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