24Aug

Números mágicos: os códigos secretos que os programadores escondem no seu PC

Desde que a primeira pessoa escreveu 5318008 em uma calculadora, os nerds esconderam números secretos dentro do seu PC e usá-los para negociar handshakes secretos entre aplicativos e arquivos. Hoje examinamos rapidamente alguns dos exemplos mais divertidos.

O que são números mágicos?

A maioria das linguagens de programação usa um tipo inteiro de 32 bits para representar certos tipos de dados por trás das cenas - internamente o número é armazenado na RAM ou usado pela CPU como 32 e zero, mas no código fonte que seria escrito emseja um formato decimal regular ou como formato hexadecimal, que usa os números 0 a 9 e as letras A a F.

Quando o sistema operacional ou um aplicativo quer determinar o tipo de arquivo, ele pode olhar para o início do arquivopara um marcador especial que significa o tipo do arquivo. Por exemplo, um arquivo PDF pode começar com o valor hexadecimal 0x255044462D312E33, que é igual a "% PDF-1.3" no formato ASCII, ou um arquivo ZIP começa com 0x504B, que é igual a "PK", que desce do utilitário PKZip original. Ao olhar para essa "assinatura", um tipo de arquivo pode ser facilmente identificado mesmo sem outros metadados.

Arquivos de classe Java compilados começam com CAFEBABE

O "arquivo" do utilitário Linux pode ser usado a partir do terminal para determinar o tipo de arquivo - de fato, lê os números mágicos de um arquivo chamado "magia".

Quando um aplicativo querpara chamar uma função, pode passar valores para essa função usando tipos padrão como inteiro, que podem ser expressos no código fonte em formato hexadecimal. Isto é especialmente verdadeiro para constantes, que são identificadores definidos com nomes legíveis por humanos como AUTOSAVE_INTERVAL, mas eles mapeiam valores de número inteiro real( ou outro tipo).Então, em vez de um programador digitando um valor como 60 sempre que eles chamam a função no código-fonte, eles poderiam usar a constante AUTOSAVE_INTERVAL para melhor legibilidade.(Constantes geralmente são facilmente reconhecidas porque estão escritas em letras maiúsculas).

Todos esses exemplos podem ser incluídos no termo Números mágicos, pois podem exigir um número hexadecimal específico para que uma função ou tipo de arquivo funcione corretamente. .. se o valor não estiver correto, não funcionará.E quando um programador quer se divertir um pouco, eles podem definir esses valores usando números hexadecimais que explicam algo em inglês, também conhecido como hexspeak.

Diversão com números mágicos: alguns exemplos notáveis ​​

Cada AppleScript termina com FADEDEAD

Se você verifica rapidamente o código-fonte do Linux, verá que a chamada do sistema _reboot() no Linux requer uma variável "mágica" a ser aprovadaisso equivale ao número hexadecimal 0xfee1dead. Se algo tentasse chamar essa função sem passar por esse valor mágico em primeiro lugar, apenas retornaria um erro.

O GUID( identificador globalmente exclusivo) para uma partição de inicialização do BIOS no esquema de partição GPT é 21686148-6449-6E6F-744E-656564454649, que forma a cadeia ASCII "Hah! IdontNeedEFI", uma alusão ao fato de que GPT seria normalmenteusado em computadores que substituíram o BIOS pela UEFI, mas não necessariamente tem que ser.

A Microsoft caiu oculto 0x0B00B135 no seu código-fonte de suporte de máquina virtual Hyper-V submetido ao Linux, então eles mudaram o valor para 0xB16B00B5 e, finalmente, eles mudaram para decimal antes de ser removido completamente do código-fonte.

Mais exemplos divertidos incluem:

  • 0xbaaaaaad - usado pelo log de bloqueio do iOS para indicar que um log é um stackshot de todo o sistema.
  • 0xbad22222 - usado pelo log de bloqueio do iOS para indicar que um aplicativo VoIP foi morto pelo iOS porque ele se comportou mal.
  • 0x8badf00d -( Ate Bad Food) usado pelos logs de choque do iOS para indicar que um aplicativo demorou muito para fazer algo e foi morto pelo tempo limite do watchdog.
  • 0xdeadfa11 -( Dead Fall) usado pelo log de falhas do iOS quando um aplicativo é forçado por um usuário.
  • 0xDEADD00D - usado pelo Android para indicar um aborto VM.
  • 0xDEAD10CC( Dead Lock) usado pelo log de falhas do iOS quando um aplicativo bloqueia um recurso em segundo plano.
  • 0xBAADF00D( Bad Food) usado pela função LocalAlloc no Windows para depuração.
  • 0xCAFED00D( Cafe dude) usado pela compressão pack200 do Java.
  • 0xCAFEBABE( Cafe babe) usado por Java como identificador para arquivos de classe compilados
  • 0x0D15EA5E( Doença) usado pela Nintendo no Gamecube e Wii para indicar uma inicialização normal aconteceu.
  • 0x1BADB002( 1 arranque ruim) usado pela especificação multiboot como um número mágico
  • 0xDEADDEAD - usado pelo Windows para indicar uma falha de depuração iniciada manualmente, também conhecida como tela azul da morte.

Estes não são os únicos lá fora, é claro, mas apenas uma pequena lista de exemplos que pareciam divertidos. Saiba mais? Conte-nos nos comentários.

Ver exemplos para si mesmo

Você pode ver mais exemplos abrindo um editor hexadecimal e abrindo qualquer número de tipos de arquivos. Há uma abundância de editores hexadecimais freeware disponíveis para Windows, OS X ou Linux - apenas certifique-se de ter cuidado ao instalar o freeware para não se infectar com crapware ou spyware.

Como exemplo adicional, as imagens de recuperação para telefones Android como ClockworkMod começam com "ANDROID!", Se forem lidas em formato ASCII.

Nota: não vai mudar nada enquanto estiver olhando ao redor. Editores Hex podem quebrar coisas!