Máquina de instruções
Registradores, instruções simples e saltos; executar à mão ou com um interpretador mostra o que o programa faz.
Por dentro, todo processador faz pouca coisa: guarda números em registradores (caixinhas de memória com nome), executa instruções simples (colocar, somar, subtrair, comparar) e, de vez em quando, salta para outra linha dependendo de um valor. Com só isso dá para escrever qualquer programa.
Alguns programas inventam a própria máquina, com instruções que só eles entendem. É um truque comum de programas maliciosos e de desafios de CTF para esconder o que o código faz. Para entender, você faz o papel da máquina.
Exemplo, com quatro instruções: pon r n (coloca n em r), som r n (soma n a r), sub r n (tira n de r) e pula r L (se r não for zero, vai para a linha L).
1 pon a 3
2 pon b 0
3 som b 5
4 sub a 1
5 pula a 3
| passo | linha | a | b |
|---|---|---|---|
| 1 | 1 | 3 | 0 |
| 2 | 2 | 3 | 0 |
| 3 | 3 | 3 | 5 |
| 4 | 4 | 2 | 5 |
| 5 | 5 | 2 | 5 (volta para 3) |
| ... | ... | ... | ... |
O laço roda 3 vezes, e b termina em 15. Repare no padrão: em vez de anotar cada volta, entenda o que uma volta faz e quantas vezes ela roda.
Os cuidados de sempre: siga cada salto (uma linha pulada nunca roda), e confira o valor do registrador no momento exato do salto. Se o programa for longo, escreva um interpretador: em Python, um dicionário para os registradores, uma variável para a linha atual e um if por instrução.
Isso importa porque é como se lê assembly e como se desmonta a "máquina virtual" de um programa ofuscado: executando passo a passo até o comportamento ficar claro.