Coisas estranhas que aprendi ao escrever um emulador x86
- Explica várias curiosidades e coisas estranhas aprendidas ao escrever emuladores x86 e amd64
- No Time Travel Debugging (TTD), um emulador de CPU é usado para registrar a execução de um processo no nível de instruções
- A primeira versão do TTD era chamada de iDNA, foi escrita em Assembly, era rápida, mas difícil de manter
- A segunda versão foi escrita em C++, melhorando a manutenibilidade
Curiosidades inúteis de codificação x86
- O esquema de codificação do x86 pode codificar a mesma instrução de várias maneiras
- A instrução
int 3 pode ser codificada como CD 03 ou CC
- O registrador
EAX é chamado de "registrador acumulador" e isso realmente faz diferença na codificação
- O prefixo
REX permite acessar uma faixa mais ampla de registradores em código de 64 bits
- As instruções podem ter até 15 bytes de comprimento, e exceder isso gera uma exceção
- O prefixo de override de endereço permite referenciar endereços de 32 bits no modo de 64 bits
Propriedades estranhas das flags
- A instrução
INC não atualiza a carry flag, ao contrário da instrução ADD
- As instruções
CMPXCHG8B/CMPXCHG16B modificam apenas a zero flag
- Instruções de shift e rotate deixam a overflow flag em estado indefinido quando a quantidade de shift é maior que 1
Mais surpresas com instruções de shift
shr ax, 10h faz um shift de 16 bits no registrador ax, zerando-o
shr eax, 20h faz um shift de 32 bits no registrador eax, mas o valor não muda
- A quantidade de shift é mascarada com
1FH
Segment override
- Segmentos ainda são usados em código de 32 e 64 bits, principalmente para thread-local storage
- No Windows, os registradores
FS ou GS são usados para referenciar o TEB (Thread Execution Block)
- Em processos de 32 bits usa-se
FS, e em processos de 64 bits usa-se GS
- No modo de 64 bits, o valor do registrador de segmento não é importante
Segment override: mais curiosidades
- No modo de 32 bits, o valor real do registrador de segmento referencia o descritor de segmento
- No modo de 64 bits, a base é controlada por MSR
- No WinDbg, não é possível ler diretamente o valor de segmento de processos de 64 bits
Conclusão
- Este texto apresenta uma lista aleatória de curiosidades sobre x86
- Escrever um emulador ajuda a entender profundamente como a CPU funciona
- É possível encontrar ótimos recursos no site do Agner Fog
Resumo do GN⁺
- Explica várias curiosidades e coisas estranhas aprendidas ao escrever emuladores x86 e amd64
- Escrever um emulador ajuda a entender profundamente como a CPU funciona
- Aborda várias curiosidades, como as diferentes formas de codificar a instrução
int 3, o prefixo REX e segment override
- É possível encontrar mais recursos no site do Agner Fog
1 comentários
Comentários do Hacker News