218 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Cheat Engine
{{#include ../../banners/hacktricks-training.md}}
[**Cheat Engine**](https://www.cheatengine.org/downloads.php) je koristan program za pronalaženje gde su važni podaci sačuvani unutar memorije pokrenute igre i njihovu promenu.\
Kada ga preuzmete i pokrenete, **prikazuje** vam se **tutorijal** o tome kako koristiti alat. Ako želite da naučite kako da koristite alat, toplo se preporučuje da ga završite.
## Šta tražite?
![](<../../images/image (762).png>)
Ovaj alat je veoma koristan za pronalaženje **gde je neki podatak** (obično broj) **sačuvan u memoriji** programa.\
**Obično se brojevi** čuvaju u **4bajtnoj** formi, ali ih možete pronaći i u **double** ili **float** formatima, ili možda želite da tražite nešto **drugačije od broja**. Iz tog razloga, morate biti sigurni da **izaberete** ono što želite da **tražite**:
![](<../../images/image (324).png>)
Takođe možete označiti **različite** tipove **pretraga**:
![](<../../images/image (311).png>)
Možete takođe označiti opciju da **zaustavite igru dok skenirate memoriju**:
![](<../../images/image (1052).png>)
### Prečice
U _**Edit --> Settings --> Hotkeys**_ možete postaviti različite **prečice** za različite svrhe kao što su **zaustavljanje** **igre** (što je veoma korisno ako u nekom trenutku želite da skenirate memoriju). Druge opcije su dostupne:
![](<../../images/image (864).png>)
## Modifikovanje vrednosti
Kada **pronađete** gde je **vrednost** koju tražite (više o tome u sledećim koracima), možete je **modifikovati** dvostrukim klikom na nju, a zatim dvostrukim klikom na njenu vrednost:
![](<../../images/image (563).png>)
I konačno **označite** kvačicu da biste izvršili modifikaciju u memoriji:
![](<../../images/image (385).png>)
**Promena** u **memoriji** će odmah biti **primenjena** (imajte na umu da dok igra ne koristi ovu vrednost ponovo, vrednost **neće biti ažurirana u igri**).
## Traženje vrednosti
Dakle, pretpostavićemo da postoji važna vrednost (kao što je život vašeg korisnika) koju želite da poboljšate, i tražite ovu vrednost u memoriji)
### Kroz poznatu promenu
Pretpostavljajući da tražite vrednost 100, **izvršite skeniranje** tražeći tu vrednost i pronađite mnogo podudaranja:
![](<../../images/image (108).png>)
Zatim, uradite nešto tako da **vrednost promeni**, i **zaustavite** igru i **izvršite** **sledeće skeniranje**:
![](<../../images/image (684).png>)
Cheat Engine će tražiti **vrednosti** koje su **prešle sa 100 na novu vrednost**. Čestitam, **pronašli ste** **adresu** vrednosti koju ste tražili, sada je možete modifikovati.\
_Ako još uvek imate nekoliko vrednosti, uradite nešto da ponovo modifikujete tu vrednost, i izvršite još jedno "sledeće skeniranje" da filtrirate adrese._
### Nepoznata vrednost, poznata promena
U scenariju kada **ne znate vrednost** ali znate **kako da je promenite** (i čak vrednost promene) možete tražiti svoj broj.
Dakle, počnite tako što ćete izvršiti skeniranje tipa "**Nepoznata početna vrednost**":
![](<../../images/image (890).png>)
Zatim, promenite vrednost, navedite **kako** se **vrednost** **promenila** (u mom slučaju je smanjena za 1) i izvršite **sledeće skeniranje**:
![](<../../images/image (371).png>)
Bićete prikazani **sve vrednosti koje su modifikovane na odabrani način**:
![](<../../images/image (569).png>)
Kada pronađete svoju vrednost, možete je modifikovati.
Imajte na umu da postoji **mnogo mogućih promena** i možete ponavljati ove **korake koliko god želite** da filtrirate rezultate:
![](<../../images/image (574).png>)
### Nasumična adresa u memoriji - Pronalaženje koda
Do sada smo naučili kako da pronađemo adresu koja čuva vrednost, ali je veoma verovatno da će u **različitim izvršavanjima igre ta adresa biti na različitim mestima u memoriji**. Dakle, hajde da saznamo kako da uvek pronađemo tu adresu.
Koristeći neke od pomenutih trikova, pronađite adresu gde vaša trenutna igra čuva važnu vrednost. Zatim (zaustavljajući igru ako želite) uradite **desni klik** na pronađenu **adresu** i izaberite "**Find out what accesses this address**" ili "**Find out what writes to this address**":
![](<../../images/image (1067).png>)
**Prva opcija** je korisna da saznate koje **delove** **koda** koriste ovu **adresu** (što je korisno za više stvari kao što je **znanje gde možete modifikovati kod** igre).\
**Druga opcija** je više **specifična**, i biće korisnija u ovom slučaju jer nas zanima da saznamo **odakle se ova vrednost piše**.
Kada odaberete jednu od tih opcija, **debugger** će biti **priključen** na program i novi **prazan prozor** će se pojaviti. Sada, **igrajte** **igru** i **modifikujte** tu **vrednost** (bez ponovnog pokretanja igre). **Prozor** bi trebao biti **ispunjen** sa **adresama** koje **modifikuju** **vrednost**:
![](<../../images/image (91).png>)
Sada kada ste pronašli adresu koja modifikuje vrednost, možete **modifikovati kod po svojoj želji** (Cheat Engine vam omogućava da ga brzo modifikujete za NOPs):
![](<../../images/image (1057).png>)
Dakle, sada možete modifikovati tako da kod ne utiče na vaš broj, ili će uvek pozitivno uticati.
### Nasumična adresa u memoriji - Pronalaženje pokazivača
Prateći prethodne korake, pronađite gde se nalazi vrednost koja vas zanima. Zatim, koristeći "**Find out what writes to this address**" saznajte koja adresa piše ovu vrednost i dvostruko kliknite na nju da biste dobili prikaz disasembly-a:
![](<../../images/image (1039).png>)
Zatim, izvršite novo skeniranje **tražeći heksadecimalnu vrednost između "\[]"** (vrednost $edx u ovom slučaju):
![](<../../images/image (994).png>)
(_Ako se pojavi više njih, obično vam je potrebna najmanja adresa_)\
Sada smo **pronašli pokazivač koji će modifikovati vrednost koja nas zanima**.
Kliknite na "**Add Address Manually**":
![](<../../images/image (990).png>)
Sada, kliknite na kvačicu "Pointer" i dodajte pronađenu adresu u tekstualno polje (u ovom scenariju, pronađena adresa na prethodnoj slici je bila "Tutorial-i386.exe"+2426B0):
![](<../../images/image (392).png>)
(Imajte na umu kako je prva "Adresa" automatski popunjena iz adrese pokazivača koju ste uneli)
Kliknite na OK i biće kreiran novi pokazivač:
![](<../../images/image (308).png>)
Sada, svaki put kada modifikujete tu vrednost, **modifikujete važnu vrednost čak i ako je adresa u memoriji gde se vrednost nalazi drugačija.**
### Injekcija koda
Injekcija koda je tehnika gde injektujete deo koda u ciljni proces, a zatim preusmeravate izvršenje koda da ide kroz vaš vlastiti napisani kod (kao što je davanje poena umesto oduzimanja).
Dakle, zamislite da ste pronašli adresu koja oduzima 1 od života vašeg igrača:
![](<../../images/image (203).png>)
Kliknite na Prikaži disassembler da biste dobili **disassemble kod**.\
Zatim, kliknite **CTRL+a** da pozovete prozor Auto assemble i izaberite _**Template --> Code Injection**_
![](<../../images/image (902).png>)
Popunite **adresu instrukcije koju želite da modifikujete** (ovo se obično automatski popunjava):
![](<../../images/image (744).png>)
Generisaće se šablon:
![](<../../images/image (944).png>)
Dakle, umetnite svoj novi assembly kod u sekciju "**newmem**" i uklonite originalni kod iz "**originalcode**" ako ne želite da se izvršava. U ovom primeru, injektovani kod će dodati 2 poena umesto oduzimanja 1:
![](<../../images/image (521).png>)
**Kliknite na izvrši i tako dalje i vaš kod bi trebao biti injektovan u program menjajući ponašanje funkcionalnosti!**
## Napredne funkcije u Cheat Engine 7.x (2023-2025)
Cheat Engine je nastavio da se razvija od verzije 7.0 i nekoliko funkcija za poboljšanje kvaliteta života i *ofanzivnog obrnute inženjeringa* je dodato što je izuzetno korisno prilikom analize modernog softvera (i ne samo igara!). Ispod je **veoma sažet vodič** za dodatke koje ćete najverovatnije koristiti tokom red-team/CTF rada.
### Poboljšanja Pointer Scanner 2
* `Pokazivači moraju završavati sa specifičnim ofsetima` i novi **Deviation** klizač (≥7.4) značajno smanjuje lažne pozitivne rezultate kada ponovo skenirate nakon ažuriranja. Koristite ga zajedno sa višekratnom mapom poređenja (`.PTR`*Poredi rezultate sa drugim sačuvanim mapama pokazivača*) da dobijete **jedan otporan osnovni pokazivač** za samo nekoliko minuta.
* Prečica za filtriranje u grupi: nakon prvog skeniranja pritisnite `Ctrl+A → Space` da označite sve, zatim `Ctrl+I` (invert) da poništite selekciju adresa koje nisu prošle ponovo skeniranje.
### Ultimap 3 Intel PT praćenje
*Od 7.5 stari Ultimap je ponovo implementiran na osnovu **Intel Processor-Trace (IPT)***. To znači da sada možete snimiti *svaku* granu koju cilj preuzima **bez pojedinačnog koraka** (samo korisnički režim, neće aktivirati većinu anti-debug uređaja).
```
Memory View → Tools → Ultimap 3 → check «Intel PT»
Select number of buffers → Start
```
Nakon nekoliko sekundi, zaustavite snimanje i **desni klik → Sačuvaj listu izvršenja u datoteku**. Kombinujte adrese grana sa sesijom `Find out what addresses this instruction accesses` da biste veoma brzo locirali visoko-frekventne tačke logike igre.
### 1-bajtni `jmp` / auto-patch šabloni
Verzija 7.5 je uvela *jedan-bajtni* JMP stub (0xEB) koji instalira SEH handler i postavlja INT3 na originalnu lokaciju. Automatski se generiše kada koristite **Auto Assembler → Template → Code Injection** na instrukcijama koje ne mogu biti patch-ovane sa 5-bajtni relativnim skokom. Ovo omogućava “uske” hook-ove unutar pakovanih ili veličinski ograničenih rutina.
### Kernel-level stealth sa DBVM (AMD & Intel)
*DBVM* je ugrađeni Type-2 hipervizor CE-a. Nedavne verzije konačno su dodale **AMD-V/SVM podršku** tako da možete pokrenuti `Driver → Load DBVM` na Ryzen/EPYC hostovima. DBVM vam omogućava:
1. Kreiranje hardverskih breakpoint-a nevidljivih za Ring-3/anti-debug provere.
2. Čitanje/pisanje paginabilnih ili zaštićenih kernel memorijskih regiona čak i kada je drajver u korisničkom režimu onemogućen.
3. Izvođenje VM-EXIT-less zaobilaženja napada na vreme (npr. upit `rdtsc` iz hipervizora).
**Savjet:** DBVM će odbiti da se učita kada je HVCI/Memory-Integrity omogućen na Windows 11 → isključite ga ili pokrenite posvećen VM-host.
### Daljinsko / cross-platform debagovanje sa **ceserver**
CE sada isporučuje potpuno prepisanu verziju *ceserver* i može se povezati preko TCP sa **Linux, Android, macOS & iOS** ciljevima. Popularni fork integriše *Frida* da kombinuje dinamičku instrumentaciju sa CE-ovim GUI-jem idealno kada treba da patch-ujete Unity ili Unreal igre koje se pokreću na telefonu:
```
# 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
```
Za Frida most pogledajte `bb33bb/frida-ceserver` na GitHub-u.
### Ostali značajni alati
* **Patch Scanner** (MemView → Tools) detektuje neočekivane promene koda u izvršnim sekcijama; koristan za analizu malvera.
* **Structure Dissector 2** prevucite-adresu → `Ctrl+D`, zatim *Guess fields* za automatsku evaluaciju C-struktura.
* **.NET & Mono Dissector** poboljšana podrška za Unity igre; pozivajte metode direktno iz CE Lua konzole.
* **Big-Endian prilagođeni tipovi** obrnuti redosled bajtova skeniranje/uređivanje (korisno za emulatora konzola i mrežne pakete).
* **Autosave & tabs** za AutoAssembler/Lua prozore, plus `reassemble()` za prepisivanje višelinijskih instrukcija.
### Instalacija & OPSEC napomene (2024-2025)
* Zvanični instalater je obavijen InnoSetup **oglasima** (`RAV` itd.). **Uvek kliknite *Decline*** *ili kompajlirajte iz izvora* da izbegnete PUP-ove. AV-ovi će i dalje označiti `cheatengine.exe` kao *HackTool*, što je očekivano.
* Moderni anti-cheat drajveri (EAC/Battleye, ACE-BASE.sys, mhyprot2.sys) detektuju CE-ovu klasu prozora čak i kada je preimenovana. Pokrenite svoju verziju za obrnuto inženjerstvo **unutar jednokratne VM** ili nakon onemogućavanja mrežne igre.
* Ako vam je potrebna samo pristup korisničkom režimu izaberite **`Settings → Extra → Kernel mode debug = off`** da izbegnete učitavanje CE-ovog nepodpisanog drajvera koji može izazvati BSOD na Windows 11 24H2 Secure-Boot.
---
## **Reference**
- [Cheat Engine 7.5 release notes (GitHub)](https://github.com/cheat-engine/cheat-engine/releases/tag/7.5)
- [frida-ceserver cross-platform bridge](https://github.com/bb33bb/frida-ceserver-Mac-and-IOS)
- **Cheat Engine tutorial, complete it to learn how to start with Cheat Engine**
{{#include ../../banners/hacktricks-training.md}}