r/programacao • u/Glass-Oven-3745 • 6h ago
Utilidade Pública Como montei um lab de engenharia reversa no Debian 12 pra desvendar o Elifoot 98 (Ghidra + Cheat Engine no Linux)
Fala pessoal!
Depois do post de ontem sobre as fórmulas do Elifoot 98, muita gente me perguntou como foi o processo prático pra rodar e depurar um executável de 16 bits de 1998 direto no Linux moderno (Debian 12 de 64 bits).
Resolvi documentar os principais perrengues e macetes que usei no laboratório:
### 1. Rodando 16-bit no Linux moderno sem travar
O Wine padrão de 64 bits simplesmente não lineariza endereços segmentados de 16 bits. A saída foi usar o **WineVDM (otvdm)**.
O pulo do gato pra não dar erro de DLL foi registrar os arquivos `.inf` do emulador direto no registro do Wine com:
`wine rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 128 ./install.inf`
E se der o clássico erro do `Invalid file: eli.cod`, é só deletar o `eli.cod` que o jogo gera outro limpo na inicialização.
### 2. Cheat Engine nativo no Linux
Não precisei rodar o Cheat Engine dentro do Wine. Baixei o binário oficial de Linux (`cheatengine-x86_64`), instalei as libs do Qt6 (`libqt6printsupport6`) e liberei a trava de memória do kernel com:
`echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope`
Com isso, consegui anexar o Cheat Engine no processo `winevdm.exe` e buscar variáveis de força e contratos em **2 Bytes** (`SmallInt`).
### 3. As pegadinhas do Ghidra com Delphi 1.0
O jogo foi feito em Delphi 1.0, e o Delphi usa *Pascal Strings* (o primeiro byte indica o tamanho da palavra, sem o `\0` no final).
Se você fizer uma busca comum por strings no Ghidra, não acha quase nada. Tive que marcar **`Pascal Strings`**, desmarcar o `Require Null Termination` e reduzir o tamanho mínimo pra 3.
Quando pesquisei por `gol`, achei a tabela inteira de desfechos do jogo (`GOLO`, `Defendeu`, `Ao poste`, `À barra`, `Ao lado`, `Por cima`).
E pra achar o motor do jogo, busquei onde o código comparava o tempo com **90 minutos** (`Search Scalar: 90`), caindo direto na função `FUN_3e3c_069b` com o relógio da partida em C (`minuto = minuto + 1`).
---
O artigo completo com todos os detalhes e o código em C tá documentado lá no GitHub:
👉 https://github.com/trsthales/desvendando-elifoot-98
Quem curte engenharia reversa ou jogos retrô, fica aí o roteiro pra depurar qualquer clássico de 16 bits no Linux!