Cheat Engine

Reading time: 11 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Cheat Engine è un programma utile per trovare dove vengono salvati valori importanti all'interno della memoria di un gioco in esecuzione e modificarli.
Quando lo scarichi e lo esegui, ti viene presentato un tutorial su come utilizzare lo strumento. Se vuoi imparare a usare lo strumento, è altamente consigliato completarlo.

Cosa stai cercando?

Questo strumento è molto utile per trovare dove alcuni valori (di solito un numero) sono memorizzati nella memoria di un programma.
Di solito i numeri sono memorizzati in forma di 4byte, ma potresti anche trovarli in formati double o float, o potresti voler cercare qualcosa di diverso da un numero. Per questo motivo devi essere sicuro di selezionare ciò che vuoi cercare:

Puoi anche indicare diversi tipi di ricerche:

Puoi anche spuntare la casella per fermare il gioco mentre scansiona la memoria:

Tasti di scelta rapida

In Modifica --> Impostazioni --> Tasti di scelta rapida puoi impostare diversi tasti di scelta rapida per diversi scopi, come fermare il gioco (che è molto utile se a un certo punto vuoi scansionare la memoria). Sono disponibili altre opzioni:

Modificare il valore

Una volta che hai trovato dove si trova il valore che stai cercando (maggiore informazioni su questo nei passaggi successivi), puoi modificarlo facendo doppio clic su di esso, quindi facendo doppio clic sul suo valore:

E infine spuntando la casella per applicare la modifica nella memoria:

La modifica alla memoria sarà immediatamente applicata (nota che fino a quando il gioco non utilizza di nuovo questo valore, il valore non verrà aggiornato nel gioco).

Cercare il valore

Quindi, supponiamo che ci sia un valore importante (come la vita del tuo utente) che vuoi migliorare, e stai cercando questo valore nella memoria.

Attraverso un cambiamento noto

Supponendo che tu stia cercando il valore 100, esegui una scansione cercando quel valore e trovi molte coincidenze:

Poi, fai qualcosa affinché il valore cambi, e ferma il gioco e esegui una scansione successiva:

Cheat Engine cercherà i valori che sono passati da 100 al nuovo valore. Congratulazioni, hai trovato l'indirizzo del valore che stavi cercando, ora puoi modificarlo.
Se hai ancora diversi valori, fai qualcosa per modificare di nuovo quel valore e esegui un'altra "scansione successiva" per filtrare gli indirizzi.

Valore sconosciuto, cambiamento noto

Nello scenario in cui non conosci il valore ma sai come farlo cambiare (e anche il valore del cambiamento), puoi cercare il tuo numero.

Quindi, inizia eseguendo una scansione di tipo "Valore iniziale sconosciuto":

Poi, fai cambiare il valore, indica come il valore è cambiato (nel mio caso è diminuito di 1) ed esegui una scansione successiva:

Ti verranno presentati tutti i valori che sono stati modificati nel modo selezionato:

Una volta trovato il tuo valore, puoi modificarlo.

Nota che ci sono molti possibili cambiamenti e puoi fare questi passaggi quante più volte vuoi per filtrare i risultati:

Indirizzo di memoria casuale - Trovare il codice

Fino ad ora abbiamo imparato come trovare un indirizzo che memorizza un valore, ma è altamente probabile che in diverse esecuzioni del gioco quell'indirizzo si trovi in posti diversi della memoria. Quindi scopriamo come trovare sempre quell'indirizzo.

Utilizzando alcuni dei trucchi menzionati, trova l'indirizzo dove il tuo gioco attuale sta memorizzando il valore importante. Poi (ferma il gioco se lo desideri) fai clic con il tasto destro sull'indirizzo trovato e seleziona "Scopri cosa accede a questo indirizzo" o "Scopri cosa scrive a questo indirizzo":

La prima opzione è utile per sapere quali parti del codice stanno utilizzando questo indirizzo (che è utile per altre cose come sapere dove puoi modificare il codice del gioco).
La seconda opzione è più specifica e sarà più utile in questo caso poiché siamo interessati a sapere da dove questo valore viene scritto.

Una volta selezionata una di queste opzioni, il debugger sarà collegato al programma e apparirà una nuova finestra vuota. Ora, gioca al gioco e modifica quel valore (senza riavviare il gioco). La finestra dovrebbe essere riempita con gli indirizzi che stanno modificando il valore:

Ora che hai trovato l'indirizzo che modifica il valore, puoi modificare il codice a tuo piacimento (Cheat Engine ti consente di modificarlo rapidamente in NOP):

Quindi, ora puoi modificarlo in modo che il codice non influisca sul tuo numero, o influisca sempre in modo positivo.

Indirizzo di memoria casuale - Trovare il puntatore

Seguendo i passaggi precedenti, trova dove si trova il valore che ti interessa. Poi, utilizzando "Scopri cosa scrive a questo indirizzo", scopri quale indirizzo scrive questo valore e fai doppio clic su di esso per ottenere la vista di disassemblaggio:

Poi, esegui una nuova scansione cercando il valore esadecimale tra "[]" (il valore di $edx in questo caso):

(Se ne appaiono diversi, di solito hai bisogno di quello con l'indirizzo più piccolo)
Ora, abbiamo trovato il puntatore che modificherà il valore che ci interessa.

Fai clic su "Aggiungi indirizzo manualmente":

Ora, fai clic sulla casella di controllo "Puntatore" e aggiungi l'indirizzo trovato nella casella di testo (in questo scenario, l'indirizzo trovato nell'immagine precedente era "Tutorial-i386.exe"+2426B0):

(Nota come il primo "Indirizzo" è automaticamente popolato dall'indirizzo del puntatore che introduci)

Fai clic su OK e verrà creato un nuovo puntatore:

Ora, ogni volta che modifichi quel valore, stai modificando il valore importante anche se l'indirizzo di memoria dove si trova il valore è diverso.

Iniezione di codice

L'iniezione di codice è una tecnica in cui inietti un pezzo di codice nel processo target e poi reindirizzi l'esecuzione del codice per passare attraverso il tuo codice scritto (come darti punti invece di sottrarli).

Quindi, immagina di aver trovato l'indirizzo che sta sottraendo 1 dalla vita del tuo giocatore:

Fai clic su Mostra disassemblatore per ottenere il codice disassemblato.
Poi, fai clic su CTRL+a per invocare la finestra di Auto assemblaggio e seleziona Template --> Iniezione di codice

Compila l'indirizzo dell'istruzione che vuoi modificare (questo di solito viene autofillato):

Verrà generato un template:

Quindi, inserisci il tuo nuovo codice assembly nella sezione "newmem" e rimuovi il codice originale dalla sezione "originalcode" se non vuoi che venga eseguito. In questo esempio, il codice iniettato aggiungerà 2 punti invece di sottrarre 1:

Fai clic su esegui e così via e il tuo codice dovrebbe essere iniettato nel programma cambiando il comportamento della funzionalità!

Funzionalità avanzate in Cheat Engine 7.x (2023-2025)

Cheat Engine ha continuato a evolversi dalla versione 7.0 e sono state aggiunte diverse funzionalità di qualità della vita e offensive-reversing che sono estremamente utili quando si analizzano software moderni (e non solo giochi!). Di seguito è riportata una guida sul campo molto condensata alle aggiunte che probabilmente utilizzerai durante il lavoro di red-team/CTF.

Miglioramenti dello Scanner di Puntatori 2

  • I puntatori devono terminare con offset specifici e il nuovo cursore Deviazione (≥7.4) riduce notevolmente i falsi positivi quando esegui una nuova scansione dopo un aggiornamento. Usalo insieme al confronto multi-mappa (.PTRConfronta i risultati con un'altra mappa di puntatori salvata) per ottenere un singolo puntatore di base resiliente in pochi minuti.
  • Scorciatoia per filtro in blocco: dopo la prima scansione premi Ctrl+A → Spazio per contrassegnare tutto, poi Ctrl+I (inverti) per deselezionare gli indirizzi che non hanno superato la nuova scansione.

Ultimap 3 – Tracciamento Intel PT

Dalla versione 7.5, il vecchio Ultimap è stato re-implementato sopra Intel Processor-Trace (IPT). Questo significa che ora puoi registrare ogni ramo che il target prende senza eseguire passo-passo (solo in modalità utente, non attiverà la maggior parte dei gadget anti-debug).

Memory View → Tools → Ultimap 3 → check «Intel PT»
Select number of buffers → Start

Dopo alcuni secondi, interrompi la cattura e clicca con il tasto destro → Salva l'elenco di esecuzione su file. Combina gli indirizzi dei rami con una sessione Scopri quali indirizzi accede a questa istruzione per localizzare rapidamente i punti critici della logica di gioco ad alta frequenza.

Modelli di jmp / auto-patch di 1 byte

La versione 7.5 ha introdotto uno stub JMP di un byte (0xEB) che installa un gestore SEH e posiziona un INT3 nella posizione originale. Viene generato automaticamente quando utilizzi Auto Assembler → Template → Code Injection su istruzioni che non possono essere patchate con un salto relativo di 5 byte. Questo rende possibili hook “stretti” all'interno di routine compresse o con vincoli di dimensione.

Stealth a livello kernel con DBVM (AMD & Intel)

DBVM è l'ipervisor di tipo 2 integrato in CE. Le versioni recenti hanno finalmente aggiunto il supporto AMD-V/SVM in modo da poter eseguire Driver → Load DBVM su host Ryzen/EPYC. DBVM ti consente di:

  1. Creare breakpoint hardware invisibili ai controlli Ring-3/anti-debug.
  2. Leggere/scrivere regioni di memoria kernel paginabili o protette anche quando il driver in modalità utente è disabilitato.
  3. Eseguire bypass di attacchi temporali senza VM-EXIT (ad es. interrogare rdtsc dall'ipervisor).

Suggerimento: DBVM rifiuterà di caricarsi quando HVCI/Memory-Integrity è abilitato su Windows 11 → disattivalo o avvia un host VM dedicato.

Debugging remoto / cross-platform con ceserver

CE ora include una riscrittura completa di ceserver e può collegarsi tramite TCP a Linux, Android, macOS & iOS target. Un fork popolare integra Frida per combinare l'istrumentazione dinamica con l'interfaccia grafica di CE – ideale quando hai bisogno di patchare giochi Unity o Unreal in esecuzione su un telefono:

# on the target (arm64)
./ceserver_arm64 &
# on the analyst workstation
adb forward tcp:52736 tcp:52736   # (or ssh tunnel)
Cheat Engine → "Network" icon → Host = localhost → Connect

Per il bridge di Frida vedere bb33bb/frida-ceserver su GitHub.

Altre utili risorse

  • Patch Scanner (MemView → Tools) – rileva cambiamenti di codice imprevisti nelle sezioni eseguibili; utile per l'analisi del malware.
  • Structure Dissector 2 – trascina-un-indirizzo → Ctrl+D, poi Indovina campi per valutare automaticamente le strutture C.
  • .NET & Mono Dissector – supporto migliorato per i giochi Unity; chiama metodi direttamente dalla console Lua di CE.
  • Tipi personalizzati Big-Endian – scansione/modifica dell'ordine dei byte invertito (utile per emulatori di console e buffer di pacchetti di rete).
  • Autosave & tabs per finestre AutoAssembler/Lua, più reassemble() per la riscrittura di istruzioni su più righe.

Note di installazione e OPSEC (2024-2025)

  • L'installer ufficiale è avvolto con InnoSetup offerte pubblicitarie (RAV ecc.). Clicca sempre su Declina o compila dal sorgente per evitare PUP. Gli AV continueranno a contrassegnare cheatengine.exe come HackTool, il che è previsto.
  • I moderni driver anti-cheat (EAC/Battleye, ACE-BASE.sys, mhyprot2.sys) rilevano la classe della finestra di CE anche quando rinominata. Esegui la tua copia di reversing all'interno di una VM usa e getta o dopo aver disabilitato il gioco in rete.
  • Se hai solo bisogno di accesso in user-mode scegli Settings → Extra → Kernel mode debug = off per evitare di caricare il driver non firmato di CE che potrebbe causare BSOD su Windows 11 24H2 Secure-Boot.

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks