Desde que la primera persona escribió 5318008 en una calculadora, los nerds han estado ocultando números secretos dentro de su PC y usándolos para negociar apretones de manos secretos entre aplicaciones y archivos. Hoy echamos un vistazo rápido a algunos de los ejemplos más entretenidos.
¿Qué son los números mágicos?
La mayoría de los lenguajes de programación usan un tipo entero de 32 bits para representar ciertos tipos de datos detrás de escena; internamente, el número se almacena en la RAM o la CPU lo usa como 32 unos y ceros, pero en el código fuente se escribiría en formato decimal regular, o como formato hexadecimal, que utiliza los números del 0 al 9 y las letras de la A a la F.
Cuando el sistema operativo o una aplicación quiere determinar el tipo de un archivo, puede buscar al principio del archivo un marcador especial que indique el tipo de archivo. Por ejemplo, un archivo PDF puede comenzar con el valor hexadecimal 0x255044462D312E33, que equivale a "% PDF-1.3" en formato ASCII, o un archivo ZIP comienza con 0x504B, que equivale a "PK", que desciende de la utilidad PKZip original. Al observar esta "firma", un tipo de archivo se puede identificar fácilmente incluso sin otros metadatos.
El "archivo" de la utilidad de Linux se puede utilizar desde el terminal para determinar el tipo de archivo; de hecho, lee los números mágicos de un archivo llamado "magia".
Cuando una aplicación quiere llamar a una función, puede pasar valores a esa función usando tipos estándar como integer, que se puede expresar en el código fuente en formato hexadecimal. Esto es especialmente cierto para las constantes, que son identificadores definidos con nombres legibles por humanos como AUTOSAVE_INTERVAL, pero se asignan a valores enteros reales (u otro tipo). Entonces, en lugar de que un programador escriba un valor como 60 cada vez que llame a la función en el código fuente, podría usar la constante AUTOSAVE_INTERVAL para una mejor legibilidad. (Las constantes suelen reconocerse fácilmente porque están escritas en mayúsculas).
Todos estos ejemplos pueden caer bajo el término Números mágicos , porque pueden requerir un número hexadecimal específico para que una función o tipo de archivo funcione correctamente ... si el valor no es correcto, no funcionará. Y cuando un programador quiere divertirse un poco, puede definir estos valores usando números hexadecimales que deletrean algo en inglés, también conocido como hechizo .
Diversión con números mágicos: algunos ejemplos notables
Si echa un vistazo rápido en el código fuente de Linux , verá que la llamada al sistema _reboot () en Linux requiere que se pase una variable "mágica" que sea igual al número hexadecimal 0xfee1dead. Si algo intenta llamar a esa función sin pasar primero ese valor mágico, solo devolverá un error.
El GUID (identificador único global) de un Partición de arranque del BIOS en el Esquema de partición GPT es 21686148-6449-6E6F-744E-656564454649, que forma la cadena ASCII "Hah! IdontNeedEFI", una alusión al hecho de que GPT se utilizaría normalmente en computadoras que reemplazaron BIOS con UEFI , pero no necesariamente tiene que ser así.
Microsoft famoso ocultó 0x0B00B135 en su código fuente de soporte de máquina virtual Hyper-V enviado a Linux, luego cambiaron el valor a 0xB16B00B5 , y finalmente ellos lo cambió a decimal antes de que se eliminara del código fuente por completo.
Más ejemplos divertidos incluyen:
- 0xbaaaaaad - utilizado por Registro de fallos de iOS para indicar que un registro es una pila de todo el sistema.
- 0xbad22222: utilizado por el registro de fallos de iOS para indicar que una aplicación de VoIP ha sido eliminada por iOS porque se comportó mal
- 0x8badf00d - (Ate Bad Food) utilizado por los registros de fallos de iOS para indicar que una aplicación tardó demasiado en hacer algo y fue eliminada por el tiempo de espera del perro guardián.
- 0xdeadfa11 - (Dead Fall) utilizado por el registro de fallos de iOS cuando un usuario fuerza el cierre de una aplicación.
- 0xDEADD00D: utilizado por Android para indicar un aborto de VM.
- 0xDEAD10CC (Dead Lock) utilizado por el registro de fallos de iOS cuando una aplicación bloquea un recurso en segundo plano.
- 0x BAADF00D (Bad Food) utilizado por el LocalAlloc función en Windows para la depuración.
- 0xCAFED00D (Cafe dude) utilizado por la compresión pack200 de Java.
- 0xCAFEBABE (Cafe babe) utilizado por Java como identificador para archivos de clases compilados
- 0x0D15EA5E (Enfermedad) utilizado por Nintendo en el Gamecube y Wii para indicar que ocurrió un arranque normal.
- 0x1BADB002 (1 arranque incorrecto) utilizado por el arranque múltiple especificación como un número mágico
- 0xDEADDEAD: utilizado por Windows para indicar un bloqueo de depuración iniciado manualmente , también conocida como la pantalla azul de la muerte.
Estos no son los únicos que existen, por supuesto, sino solo una breve lista de ejemplos que parecen divertidos. ¿Sabes de algo más? Dinos en los comentarios.
Ver ejemplos por ti mismo
Puede ver más ejemplos abriendo un editor hexadecimal y luego abriendo cualquier número de tipos de archivos. Hay muchos editores hexadecimales gratuitos disponibles para Windows, OS X o Linux, solo asegúrese de tener cuidado al instalar software gratuito para no infectarse con crapware o spyware.
Como ejemplo adicional, las imágenes de recuperación para teléfonos Android como ClockworkMod comienzan con "¡ANDROID!" si se lee en formato ASCII.
Nota: no cambie nada mientras mira a su alrededor. ¡Los editores hexadecimales pueden romper cosas!