Cheat Engine Nativo no Linux: Como inspecionei a memória do Elifoot 98 no Debian 12
Depois do post sobre a engenharia reversa do Elifoot 98, achei válido registrar a parte prática do laboratório: como usar o Cheat Engine nativo no Linux para inspecionar processos e achar endereços de memória.
Muita gente acaba rodando o Cheat Engine dentro do Wine por achar que ele só existe para Windows, mas no próprio site oficial (cheatengine.org) existe um binário nativo para Linux.
Abaixo estão os ajustes que precisei fazer no Debian 12 para colocar o ambiente de pé e conectar a análise dinâmica com o Ghidra.
1. Dependências do Qt6 e Permissão de Kernel
Ao tentar rodar o ./cheatengine-x86_64 pela primeira vez, tive um erro de biblioteca ausente (libQt6PrintSupport.so.6). No Debian 12, a instalação dos pacotes base do Qt6 resolve isso:
sudo apt update && sudo apt install -y libqt6printsupport6 qt6-base-dev
O segundo ponto é que o kernel do Linux bloqueia por padrão que processos comuns leiam a memória de outros processos (proteção do módulo Yama ptrace). Para liberar o acesso do Cheat Engine sem precisar executá-lo como root:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
E para inicializar puxando as bibliotecas locais da pasta:
LD_LIBRARY_PATH=. ./cheatengine-x86_64
2. O Processo e o Tipo de Dado (16-bit)
Como o Elifoot 98 roda sob a camada do WineVDM, o processo correto para selecionar na lista do Cheat Engine é o winevdm.exe.
Um detalhe importante na hora de buscar os valores: o padrão do Cheat Engine é buscar inteiros de 4 Bytes. Como estamos lidando com um executável de 16 bits (Borland Delphi 1.0), atributos como Força, Idade e Contratos ocupam apenas 2 Bytes (SmallInt). Alterando o tipo para 2 Bytes, foi fácil isolar o endereço do jogador.
3. A Estrutura do Jogador na Memória
Pelo Memory Viewer do Cheat Engine, inspecionei os bytes ao redor do endereço encontrado (DS = 0x8484). A struct de cada atleta ocupa cerca de 32 a 40 bytes contíguos:
- O valor da força (em 2 bytes);
- O contador de jogos de contrato restantes;
- O salário/valor de mercado;
- As siglas de texto com as nacionalidades (
ING,IRL,NOR,W).
Isso ajudou a confirmar na prática que o jogo não guarda atributos ocultos como passe, drible ou moral individual secreta.
4. Do Cheat Engine para o Ghidra
O recurso mais útil durante a análise foi o "Find out what writes to this address" (F6).
Coloquei um ponto de interrupção no byte de força de um titular e avancei uma rodada no jogo. O Cheat Engine capturou a instrução de escrita no deslocamento 0x4B14. Com esse endereço em mãos, bastou ir no Ghidra, usar o atalho de navegação (g) e pular direto para a função FUN_17fb_4a41, que faz o cálculo de evolução e desgaste pós-jogo.
Os códigos em C descompilados e as demais análises continuam abertos no repositório do projeto:
https://github.com/trsthales/desvendando-elifoot-98
Link do primeiro post: https://www.tabnews.com.br/trsthales/desvendei-o-codigo-do-elifoot-98-apos-25-anos-engenharia-reversa-em-16-bit-com-ghidra-no-linux
Link do segundo post: https://www.tabnews.com.br/trsthales/desvendando-o-elifoot-98-parte-2-como-montar-um-laboratorio-de-engenharia-reversa-de-16-bits-no-debian-12-com-ghidra-winevdm-e-cheat-engine