Bioshock Infinite "Trainer" - Pointer??

05/02/2013 15:47 PRiiMEx#1
Hallo!

Da ich mit C++ angefangen habe vor kurzem, Bioshock Infinite schon durch habe und etwas zum üben brauche wollte ich einen kleinen Trainer schreiben.

Am Anfang habe ich mit der Cheat Engine die Base Pointer aller Werte rausgesucht die ich brauche. (Leben, Schild, Schnelligkeit, Sprunghöhe, Geld, Salze, Lockpicks.. )

Nehmen wir als beispiel den Base Pointer vom Geld:

"BioShockInfinite.exe"+012BCC1C
Offset: 50C
Offset: 398

Cheat Engine zeigt mir an:

"BioShockInfinite.exe"+012BCC1C = 13ECA494
13ECA494 + 398 = 1EBD5400
1EBD5400+ 50C = 1EBD590C

Da ich nicht weiß wie ich in C++ die Pointer mit den Offsets schreibe, nehme ich an das ich für Geld diese Adresse verwenden kann: 1EBD590C

Der Eintrag wäre folgender:

Code:
unsigned adress = 0x1EBD590C;
Die Value von dem Geld ist momentan 1017.
Um herauszufinden ob ich überhaupt bei der richtigen Adresse bin, habe ich folgenden befehl eingebaut:

Code:
ReadProcessMemory(ProcessHandle,(void*)adress,&value,sizeof(int),0);
Und mir dann ausgeben lassen:

Code:
cout << value << endl;
Das Problem ist das mir aber -2 als value ausgegeben wird und nicht 1017.
Auch schreiben kann ich nichts.

Code:
int fallsErfolgreich = WriteProcessMemory(ProcessHandle,(LPVOID)adress,&value,sizeof(int),NULL); 
                                                      
    if (fallsErfolgreich > 0) {
        cout << "Wert geschrieben" << endl;
        } else {
        cout << "Wert konnte nicht geschrieben werden." << endl;
        }

Dann kommt "Wert konnte nicht geschrieben werden."
Ich denke das Problem liegt an der Adresse / dem Pointer.
Die Pointer sind aufjedenfall richtig, nur weiß ich nicht genau wie ich sie in C++ übernehme.

Wäre super wenn jemand weiter weiß.

Vielen Dank

/E: Das gleiche widerfährt mir auch wenn ich die "normale" Adresse von der Munition z.B. nehme:

24ED9EBC

also 0x24ED9EBC, das gleiche Problem.
05/02/2013 16:26 snow#2
Du verwendest keinen Pointer, du nimmst eine statische Adresse.
[[[BaseAddress + 0x012BCC1C] + 0x398] + 0x50C] - hier liegt dein Wert, nicht bei 1EBD590C, das wird sich wahrscheinlich bei jedem Start ändern.

Schau dir mal noch mal das Prinzip der Pointer an.

Und bist du dir sicher, dass int bei dir 4 Byte hat?
05/02/2013 18:12 PRiiMEx#3
Tatsächlich ändert sich 1EBD590C bei jeden Start..
Aber kann ich "[[[BaseAddress + 0x012BCC1C] + 0x398] + 0x50C]" so in C++ übernehmen?

Auch wenn ich mir nicht ganz sicher bin worauf es hinausläuft, int müsste 4 Byte haben.
05/02/2013 20:03 dready#4
Ja kannst du, google am besten mal die Folgenden Begriffe

Pointer, Dynamic Memory allocation, memoryread

Damit solltest du einen besseren Überblick bekommen und kannst dann eine etwas konkreter Fragestellung machen :)
05/02/2013 21:28 [B]roghurt™#5
Der Vollständigkeit halber verlinke ich hier mal einen Thread, der mir geholfen hat das Ganze zu verstehen: [Only registered and activated users can see links. Click Here To Register...]
05/02/2013 23:34 Cambios#6
Das was du in deinem Code machst ist es ja nur die Statische Addy zu nutzen,was du machen musst ist aber die Offsets zur Base dazuzurechnen.
Pseudocode:

Quote:
DWORD base = Get_Baseaddy("spiel");
DWORD money = base+0x00; //Offset halt dazurechnen
int cash = WertAuslesen(money);
Wie das ganze in C++ ausschaut musst selbst nachschaun, tipp -> ReadProcessMemory

Grüße
05/03/2013 06:22 Kosic#7
Was vielleicht noch zu erwähnen wäre ist, dass mann nach jedem addieren des offsets zu einer Adresse, die Memory auslesen muss.
D.h. :
Pseudocode
Code:
DWORD tmpAddress;
DWORD ammo[3] = { OxBASE, 0xOFFSET, 0xOFFSET }; //ADRESSE + OFFSETS DEKLARIEREN

ReadProcessMemory(ammo[0], &tmpAddress[0]); //MEMORY AUSLESEN
tmpAddress[0] = tmpAddress[0] + ammo[1]; //OFFSET ADDIEREN
ReadProcessMemory(tmpAddress[0], &tmpAddress[1]); //MEMORY ERNEUT AUSLESEN
tmpAddress[1] = tmpAddress[1] + ammo[2]; //OFFSET ADDIEREN
Mfg,
Kosic
05/03/2013 13:21 Cambios#8
Quote:
Originally Posted by Kosic View Post
Was vielleicht noch zu erwähnen wäre ist, dass mann nach jedem addieren des offsets zu einer Adresse, die Memory auslesen muss.
D.h. :
Pseudocode
Code:
DWORD tmpAddress;
DWORD ammo[3] = { OxBASE, 0xOFFSET, 0xOFFSET }; //ADRESSE + OFFSETS DEKLARIEREN

ReadProcessMemory(ammo[0], &tmpAddress[0]); //MEMORY AUSLESEN
tmpAddress[0] = tmpAddress[0] + ammo[1]; //OFFSET ADDIEREN
ReadProcessMemory(tmpAddress[0], &tmpAddress[1]); //MEMORY ERNEUT AUSLESEN
tmpAddress[1] = tmpAddress[1] + ammo[2]; //OFFSET ADDIEREN
Mfg,
Kosic
stimmt, hatte ich ganz vergessen zu erwähnen, aber klar is ja nen Pointer..sollte dem TE klar sein wenn er sich kurz eingelesen hat was ein Pointer ist und wie sie funktionieren..hoffe ich :D
05/03/2013 17:37 PRiiMEx#9
Ok, habs jetzt raus. Danke nochmal!