Skip to main content

/writings / br / patching-sse4x-software-for-older-cpus

BR

Patcheando Software SSE4.x para CPUs Mais Antigas

Reverse Engineering
Also in:EN
Auto-translated from English.read original ↗

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:

CPU-Z mostrando os conjuntos de instruções suportados
CPU-Z mostrando os conjuntos de instruções suportados

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:

Definindo o breakpoint de exceção
Definindo o breakpoint de exceção

Footnotes

  1. Instruction Set Architecture (Arquitetura do Conjunto de Instruções)

  2. Streaming SIMD Extensions

  3. Advanced Vector Extensions

  4. Commercial Off-The-Shelf (Disponível Comercialmente)

  5. Crash To Desktop

Patcheando Software SSE4.x para CPUs Mais Antigas | antrum