C++ Brauche Hilfe bei Base Pointer find und richtig im Code einzufügen

03/30/2015 14:44 The_larw#1
Hallo, ich die letzten Tage nur geschlafen oder hab versucht Base Pointer zufinden bzw sie richtig in mein Code einzufügen.
In der Zeit hab ich so viele verschiedene Quellcodes mir geladen teilweise mit und teilweise ohne Offsets Variable.
Ich hab so viel verschiedenes über Base Pointer gehört das ich jetzt nicht genau weis, was ich damit machen muss bzw wie ich den wirklich bekomme.

Mein größtes Problem ist ich wollte ein RadarHack für CSGO zum testen schreiben, ist eig. ja auch relativ Easy, die Dynamischen Adressen findet man ja einfach Problem ist nur ich finde keine statische.

Wenn ich eine statische adresse manuell mit rechtklick scan for .... komm ich immer wieder zu den gleichen Adressen und habe zwar eine grüne aber das ist nur die server.dll die kann ich doch dafür nicht benutzten oder, weil der doch eig nur der Server hat?


Wenn ich mit Rechtsklick Pointer Scann mache bekomme ich immer nur Server.dll , Client.dll oder Engine.dll aber keine csgo.exe. Jetzt weis ich nicht ob ich was flasch gemacht habe oder ob ich theoretisch die Engine.dll oder die Client.dll dafür verwenden kann.
Wenn ja wie? da ich mir wirklich Mühe gegeben habe den c++Code auch wirklich alles zu verstehen war aber nicht möglich da mein English extrem schlecht ist(ich weis man braucht English zum Programmieren) und keine Deutsche erklärungen gefunden habe. Am wenigsten verstehe ich bei Readund writememory process was in den Klammern wirklich muss mit copyand paste hat das zwar mit den dynamischen Adressen nach einen tag dann auch geklappt(hatte am Anfang ein Tippfehler:)

Und ich weis nicht Was ich mit dem Base Pointer machen muss, ich weis nur irgendwie

z.B WENN ich als Base Pointer Engine.dll+004C5C(ist jetzt nur ein Beispielwert , also ausgedacht) und sagen wir mal 2 offsets habe, 7C und 238. Wie muss ich das schreiben in c++.

ich hab da echt keine idee mehr und hab schon wie gesagt seit tagen nur gegooglet in Foren geuckt ausprobiert, ausprobiert, teilweise auch Nächte durch.


Deswegen würde ich mich sehr freuen, wenn ihr mir helfen könntet.

-The_Larw
03/31/2015 20:01 Slade100#2
also bin mir nicht sicher ob man das mit einer .dll machen kann und die base adress davon wüsste ich gerade auch nicht :D aber wenn du z.b engine.exe + 004c5c dann ist das 404c5c da .exe die base adresse 00400000 haben naja und der gemütlcihste weg das in deine dll zu machen ist der hier finde ich ;)
DWORD Adresse = *(DWORD*)0x404c5c;
DWORD Adresse1 = (DWORD)(Adresse + 0x238);
DWORD Adresse2 = *(DWORD*)Adresse1;
DWORD Adresse3 = (DWORD)(Adresse2+ 0x7C);
04/01/2015 05:27 The_larw#3
Erstmal danke für deine Antwort wenn ich ehrlich bin hab ich damit nicht mehr gerechnet das jemand mir noch antwortet, deswegen hab ich das auch jetzt erst gesehen :

Das die Base Adresse 00400000 ist habe ich auch schon öfters gelesen, war mir aber nie wirklich sicher was ich damit machen sollte?

Einfach da zu addieren wie hier oder wie?

DWORD Adresse = *(DWORD*)0x404c5c ;
DWORD Adresse1 = *(DWORD*)Adresse + 0x00400000;
DWORD Adresse2 = (DWORD)(Adresse1 + 0x238);
DWORD Adresse3 = *(DWORD*)Adresse2;
DWORD Adresse4 = (DWORD)(Adresse3 + 0x7C);

Oder ist das falsch so?

Die Base Adresse per Code immer Auslesen lassen also auch von einer .dll geht wahrscheinlich nicht so einfach
04/01/2015 17:44 Slade100#4
ne die musst du ja normal auf die adresse adieren nicht als dword ptr:D du hast ja die adresse 4C5C gesagt, dann einfach 4C5C+400000 = 404c5c (siehe oben) die adresse die ich genommen habe
04/01/2015 17:50 Padmak#5
Das Problem ist: keine der dll-Dateien (Client,Server,Engine) wird als Base-Address 0x400000 haben
Soweit ich weiß musst du dir die Base-Address der Module schlicht selbst holen, von da aus kannst du dann munter herumrechnen
Ach und nur weil eine Datei Server.dll heißt, heißt das noch lange nicht dass sie auf dem Server ausgeführt wird, die läuft ganz normal auf deinem PC in dem Prozess
Sie heißt nur zufällig so

Padmak
04/01/2015 18:53 The_larw#6
Erstmal danke Padmak für deine Antwort, okay das ist schonmal gut zu Wissen das die Server.dll nur zufällig so heist, und ich die trotzdem dafür verwenden könnte, dachte halt nur vllt hab ich das nur weil ich ja ein Bot Game mache und damit automatisch mit den Server hoste.


Ich hab auch in den letzten Stunden gegoogelt,gesucht, wie ich mir die Base Adresse hole, bzw ich brauch ja die von der .dll, leider hab ich nichts wirklich gefunden wie das funktionieren soll, lag wohl an meinen schlechten Englischkenntnissen.

Es wäre sehr hilfreich und nett von dir wenn du mir erklären könntest wie ich die Base Adresse ermittel, ich hab zwar schon irgendwie von Getmodulehandle gelesen, hab aber nicht brauchbares hin bekommen

-The_Larw
04/01/2015 20:35 Padmak#7
Ja, GetModuleHandle ist das richtige
Mit deinem Beispiel würde es (evtl Pseudocode, hab keinen Bock es auszuprobieren) so aussehen (und unsauber ist der Code auch):
Code:
DWORD baseAddress = (DWORD)GetModuleHandle("Server.dll");
DWORD address = baseAddress + 0x40irgendwas;
DWORD firstOffset = *(DWORD*)address + 0xerstesoffset;
DWORD secondOffset = *(DWORD*)firstOffset + 0xzweitesoffset;
DWORD deinWert = *(DWORD*)secondOffset;
Bitte nicht hauen wenn es nicht stimmt, habe es nur aus'm Kopf geschrieben.
Kannst es aber mal aus ausprobieren

Padmak
04/01/2015 21:16 The_larw#8
So nochmal vielen dank für deine Antwort.

ich hab das jetzt so probiert

DWORD baseAddress = (DWORD)GetModuleHandle("isaac-ng.exe");
DWORD address = baseAddress + 0x0021E5A0;
DWORD firstOffset = *(DWORD*)address + 0x238;
DWORD secondOffset = *(DWORD*)firstOffset + 0x7B0;
DWORD thirdOffset = *(DWORD*)secondOffset + 0x3DC;
DWORD deinwert = *(DWORD*)thirdOffset;

//DWORD deinwert = 0x16DA819C;
DWORD value = 0x6;

WriteProcessMemory(handle, (void *)deinwert, &value, 4, NULL);

dann kommt aber immer ein "Zugriffsverletzung beim Lesen an Position ... "
mach ich da was falsch oder ist der code so falsch?

zum testen hab ich auch

DWORD deinwert = 0x16DA819C;
DWORD value = 0x6;

WriteProcessMemory(handle, (void *)deinwert, &value, 4, NULL);

versucht, die 0x16DA819C ist aber nur eine dynamische, so klappt das aber mit dem anderen code kommt wiegesagt der fehler
04/01/2015 22:41 Padmak#9
(BINDINGOFISAAC!)
Wenn du die Baseadress haben willst, reicht GetModuleHandle(NULL)
Warte mal.. Führst du das in einem Prozess von dir aus oder injectest du das als DLL?

Padmak
04/01/2015 23:23 The_larw#10
danke für deine Antwort.
hat das (BINDINGOFISAAC!) irgendeine bedeutung?

okay also wenn ich die baseadresse von der exe haben will, reicht also GetModuleHandle(NULL) aus?

erstmal wollte ich das extern machen und später als dll und dann injecten.
macht das denn ein unterschied ob externel oder dll ?
04/01/2015 23:43 Padmak#11
Es hat die Bedeutung, dass ich BOI erkannt habe und cool finde, ist aber eher offtopic ;)

Ja natürlich macht das einen Unterschied, GetModuleHandle funktioniert nur im eigenen Prozess.
Die Baseaddress von einem Fremden Modul kann man denke ich aber ähnlich einfach herausfinden, das müsstest du dir aber selbst raussuchen

Padmak
04/02/2015 00:07 Requi#12
Quote:
Originally Posted by The_larw View Post
erstmal wollte ich das extern machen und später als dll und dann injecten.
macht das denn ein unterschied ob externel oder dll ?
Ja macht es, da du intern keine prozess id übergeben musst (afaik), da du ja schon selbst im Prozess bist. Da würde GetModuleHandle("moduleName.dll") klappen. Aber extern, weiß das Programm ja nicht von welchem Prozess. Ich denke mal da würde es automatisch den eigenen Prozess nutzen. Ergo du musst die prozess id vom Spiel übergeben.

@Padmak. bitte nicht hauen. bin in c++ nicht sehr gewandt.

Zu deinem Beispiel für CS:GO. Da würden sich die meisten Dinge die du brauchst in der client.dll befinden. Auch wenn ich dafür zugeflamed werde, empfehle ich dir für CS (bzw. generell Source Spiele) die Tutorials zu CSS von Fleep anschauen. Da erkennt man schon mal wie Source Games intern "funktionieren".
04/02/2015 01:44 The_larw#13
Erstmal nochmal vielen dank für die Antworten, das hatte ich ja gemacht gehabt geguckt wie GetModuleHandle funktioniert nichts gefunden. Wollte jetzt das einfach als dll machen, problem ist da hab ich keine ahnung wie ich da writeprocessmemory verwenden muss.

Ich hatte schon versucht gehabt mir Videos von Fleeps anzugucken, um etwas dabei zu lernen ist mein english aber leider zu schlecht
04/02/2015 01:53 snow#14
Wenn du mit einer DLL arbeitest, agierst du im Normalfall innerhalb des Adressraums des Prozesses (und der PEB ist der selbe, weshalb GetModuleHandle ein Handle zum entsprechenden Modul returnen kann etc.), wodurch du direkt mit dem Speicher interagieren kannst.

Wenn du einen externen Prozess nutzt, kannst du nicht einfach in fremden Adressräumen rumspielen (die Infos dazu fehlen ja), weshalb du ein Prozess-Handle benötigst und dann den Kernel arbeiten lassen musst (OpenProcess, RPM / WPM), selbiges gilt auch für die Modul-Enumeration (Module32First/Next) etc.

Wie hier also bereits geschrieben wurde, musst du die Base Address des Moduls anderweitig rausfinden.
Du könntest z.B. [Only registered and activated users can see links. Click Here To Register...] nutzen, über die Prozesse iterieren und anschließend über die Module des entsprechenden Prozessses zu iterieren, um das gewünschte zu finden. In der Struktur gibt es dann den Eintrag BYTE *modBaseAddr ([Only registered and activated users can see links. Click Here To Register...]), das ist genau was du vermutlich suchst. Mit dem Eintrag th32ProcessID kannst du dann auch OpenProcess für Read/WriteProcessMemory verwenden.
04/02/2015 15:10 The_larw#15
Erstmal danke für deine hilfe Snow, ich hab damit jetzt ein bissen rumprobiert aber nicht wirklich hinbekommen, weil ich nicht genau weis was genau ich damit machen muss etc