Note
Este post foi datado retroativamente para coincidir com a data em que foi publicado por mim em um fórum russo (IYKYK).
Introdução
A maioria das CPUs modernas é compatível entre si porque compartilham a mesma ISA1. A ISA mais comum hoje é a x86_64, uma extensão de 64 bits da antiga arquitetura x86. A necessidade de operações mais complexas e rápidas, especialmente em aritmética de ponto flutuante, levou a extensões como SSE2 e AVX3.
Essas extensões compreendem várias versões que permitem ao processador interpretar diferentes conjuntos de opcodes. SSE vai até a versão 4.2, com uma versão 4a exclusiva da AMD. AVX vai até AVX-512, mas o conjunto de extensões mais comum em CPUs COTS4 é o AVX-2.
Ao compilar software, é possível definir uma flag que dita se o código de máquina resultante será compatível com um conjunto específico de extensões. Essa escolha pode levar a um melhor desempenho porque as extensões podem realizar certas operações usando menos ciclos de CPU.
Entretanto, CPUs mais antigas que são perfeitamente capazes de executar software moderno podem ter sido introduzidas no mercado antes das extensões mais recentes ficarem disponíveis. Como tal, software compilado com essas instruções mais novas simplesmente não consegue executar nelas.
Detectando Suporte a Extensões
A descrição dessas extensões está incluída nas flags CPUID. A maneira mais fácil de verificar se sua CPU suporta instruções específicas é através do CPU-Z:
Você também pode simplesmente tentar executar o software. Ele pode exibir um pop-up dizendo que não é compatível, ou simplesmente travar silenciosamente. Verifique o Visualizador de Eventos do Windows para o código de erro 0xC000001D, que indica que uma instrução ilegal foi tentada.
Processo de Patch
Vou descrever o processo de patching que usei para contornar essas instruções no jogo Days Gone. Este é o meu método e não é necessariamente o ótimo, mas funciona. Note que mesmo compradores legítimos do jogo não conseguiam rodá-lo em processadores ligeiramente mais antigos — ao patchear algumas instruções, consegui torná-lo compatível.
Executar o jogo produz um CTD5 imediato, com o processo desaparecendo do Gerenciador de Tarefas. Não há avisos ou indicações do problema.
Configurando o Debugger
Carregue o jogo no x64dbg e defina um breakpoint em EXCEPTION_ILLEGAL_INSTRUCTION. Essa exceção é levantada quando o processador encontra um opcode desconhecido: