EN/DE: Cheat Engine beginner questions

12/25/2017 12:20 whok3hrs#1
EN:

Hey guys,

I've got two beginner questions about cheat engine, which should be just understanding problems.

1) Am I right, that the base address (which will change every start of the application) is calculated just by e.g. the instruction address (71DBF9) and the
corresponding offset (Bejeweled3.dll+31DBF9), so that it is after subtraction 400000?
If yes, what's that "Base" in the memory viewer? ("Protect=Read/Write Base=32FD1000 Size=87000").

And because this 400000 is that even, is that a predefined address by windows?

2) I'm messing around a bit with Bejeweled 3.
Everytime you're combining 3+ gems, the highscore gets increased by 100, 200, ...
So I set a breakpoint on that instruction and if I'm combining 3 gems, the register, which gets moved to the highscore, contains 0x14 (= 20 decimal).
And this instruction gets called five times, which makes sense: 5 calls * 20 points (in the register) = 100 points.

But how can I find out, how it is determined how many times the instruction gets called? Just go back in the instructions and check it somehow?

And I also would like to find out the "check"-instruction, which even checks whether 3 or more gems are combined.
Should I also go back in the instructions and set breakpoints..? Or how should I go on here?

Thanks for reading and your time! Cheers :)


DE:
Guten Morgen zusammen :)

Ich habe mal zwei kleine Fragen bzgl. Cheat Engine, was lediglich Verständnisfragen sein dürften.

Sehe ich das grundsätzlich richtig, dass sich die Basisadresse (die sich ja nach jedem Neustart ändert) schlichtweg durch Subtraktion der bspw. Instruktionsadresse (wird mir als 0071DBF9 angezeigt) und dem jeweiligen Offset (Bejeweled3.dll+31DBF9) und damit also 00400000 ergibt?

Wenn ja, was ist dann die "Base" im Memory Viewer? ("Protect=Read/Write Base=32FD1000 Size=87000").

Und da diese 00400000 so glatt sind, ist das irgendwie schon von Windows eine vordefinierte Adresse, die für Prozesse belegt werden kann?


Testweise frickel ich gerade ein bisschen mit Bejeweled 3 rum... Beim Highscore schreibt eine Instruktion insgesamt bei jedem (korrekten) Zug 5 Mal und der Highscore erhöht sich um 100.
Habe dann mal einen Breakpoint beim Aufrufen der Instruktion gesetzt und im Register, das letztendlich in die Highscore-Adresse geschoben wird, ist "14" (= Dezimal 20) enthalten. Was ja auch Sinn ergibt, denn 5 * 20 = 100.

Jetzt ist ja aber eins klar - auch diese Instruktion muss aufgerufen werden und insbesondere festgelegt werden, dass sie 5 Mal aufgerufen wird.

Dazu mal eine weiterführende Frage: Bei der besagten Instruktion wird in Abhängigkeit der kombinierten Steine (keine, 3, 4, 5) entsprechend die Punkte vergeben bzw. der Call dementsprechend oft ausgeführt (einmal ausgeführt: 20 Punkte und dementsprechend wird die Anzahl angepasst).

Wenn ich jetzt zu der "Prüf"-Instruktion gelangen will, ob überhaupt mindestens 3 Steine kombiniert sind, bleibt mir nichts anderes übrig, als stichprobenartig vor der Highscore-Instruktion immer wieder Breakpoints zu setzen..oder wie geht man da am besten vor?

Danke fürs Lesen und viele Grüße ;)
12/25/2017 15:39 Dr. Coxxy#2
@ Basisadresse:
Jein, 0x400000 ist tatsächlich die windows x86 "standardadresse" an der exes gemappt werden, allerdings kannst du dich nicht darauf verlassen, dass das immer so ist.
Neuere programme werden mit expliziter aslr kompatibilität kompiliert wobei die basisadresse mehr oder weniger "zufällig" ist.
Außerdem lassen sich selbst für solche alten programme im nachhinein aslr aktivieren (wodurch einige schlecht programmierte nicht mehr funktionieren, es die meisten allerdings noch tun).
Deswegen solltest du immer mit GetModuleHandle(NULL) (intern) oder extern z.B. mit toolhelp32 die basisadresse holen und dann den offset draufrechnen (also in deinem beispiel z.B. <Basisadresse der exe>+0x31DBF9.
Falls du nur CE benutzt kannst du es einfach bei ModulName+Offset belassen, ce löst automatisch module auf.

@ Reversing
Würde ich dir mal empfehlen dich mal ins thema reversing einzulesen, aber ja, grob gesagt setzt man breakpoints und geht immer weiter zurück und versucht die stelle zu finden wo schlussendlich die entscheidung getroffen wurde wie oft deine funktion aufgerufen wird.
Hilfreich sind hierbei rechts unten in der memoryanzeige der callstack (wenn breakpoint getriggert wurde) der einem meist relativ zuverlässig zeigt von wo der aufruf ausgeführt wurde und die umliegenden funktionen.
In deinem Fall vielleicht nicht so hilfreich, da du die funktion bereits gefunden hast, aber wenn du keine memoryadresse hast die in der gesuchten funktion verändert wird, du aber weißt wie oft deine gesuchte funktion vermutlich aufgerufen wird, hilft auch noch das hier:
04/11/2018 15:34 dasistmeiname#3
Hey ho hätte auch eine Frage bezüglich zu CE und den Basepointern und wie ich diese mit einem Packetlogger verbinden kann, da den Server beispielsweise daszu bringen möchte einen Dropp eines Items vorzumachen welches man dann aufheben kann, so das es nicht nur Clientside ist. Bin mir aber nicht mal ganz sicher ob das überhaupt möglich ist. Leider noch im Anfangsbereich und versuche mir solche sachen grundsätzlich durch Ausprobieren anzueignen nur daran scheitere ich leider bis jetzt.

Wenn sich jemand damit auskennt kann er sich ja mal bei mir melden, wenn er das dann auch erkläre könnte so das ich es auch verstehe, noch besser :D