Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   csgo readprocessmemory, Speicher auslesen, Werte nicht wie erwartet (https://www.delphipraxis.net/201538-csgo-readprocessmemory-speicher-auslesen-werte-nicht-wie-erwartet.html)

Jonas Shinaniganz 30. Jul 2019 14:54

csgo readprocessmemory, Speicher auslesen, Werte nicht wie erwartet
 
Hallo, ich hatte mir nach 4 Jahren Pause mal überlegt die neuste Delphi Community Version zu installieren und etwas auf die alten Zeiten zu programmieren.

Direkt zum Problem, mit ReadProcessMemory soll etwas Speicher aus dem Spiel csgo ausgelesen werden...

mit Hilfe des ClientDLL_Base Pointers und dem entsprechenden Offset im Speicher (off_LocalPlayer), lade ich den Pointer zum lokalen Spieler-Speicherbereich

Delphi-Quellcode:
    ReadProcessMemory(phandle,
                      Pointer(ClientDLL_Base + off_LocalPlayer),
                      @LocPlayer_Base,
                      sizeof(LocPlayer_Base),
                      Val);
danach wollte ich mit folgendem Aufruf an die Health-Points meines Charakters kommen

Delphi-Quellcode:
   
    ReadProcessMemory(phandle,
                      Pointer(LocPlayer_Base + off_iHealth),
                      @hp,
                      sizeof(hp),
                      Val);
allerdings erhalte ich einen Wert zurück, welcher nicht zwischen 0 und 100 liegt sondern 6729020.

Habt Ihr einen Tipp für mich, an welcher Stelle ich nachhaken sollte? Ich tappe schon eine Weile im dunklen.

Hier sind noch die Variablen mit Ihren Typen, scheinbar Fehlen mir Informationen bezüglich Pointern und 64 bit...
Keine Ahnung. Falls Ihr noch etwas Rückfragen wollt gerne.

Delphi-Quellcode:
var
    phandle : THandle;
    pid : cardinal;
    cth32ssHandle: THandle;
    ModuleEntry, clientE32, engineE32 : TModuleEntry32;
    ClientDLL_Base, EngineDLL_Base : NativeUInt;
    Val : NativeUInt;
    hp : NativeInt;

const
    off_LocalPlayer = $CF3A4C;
    off_iTeamNum = $F4;
    off_iHealth = $100;

      // vorher gehe ich noch die System Prozesse durch und schaue mir dort die Module etwas genauer an
      if SameText('client_panorama.dll', ModuleEntry.szModule) then
      begin
          clientE32 := ModuleEntry;
      end;
      // um von dort die entsprechende Einstiegssadresse zu bekommen
      ClientDLL_Base := NativeUInt(clientE32.modBaseAddr);
LG Jonas

Neutral General 30. Jul 2019 15:24

AW: csgo readprocessmemory, Speicher auslesen, Werte nicht wie erwartet
 
Bist du dir denn sicher, dass die Offsets richtig sind?
Das kann (wird) sich mit jedem Update des Spiels ändern.

Jonas Shinaniganz 30. Jul 2019 15:46

AW: csgo readprocessmemory, Speicher auslesen, Werte nicht wie erwartet
 
leider bin ich mir da überhaupt nicht sicher, ich hatte mich hierdrauf blind verlassen...
Also ich prüfe das jetzt mal selbst nach mit den offsets, allerdings glaube ich, die Person hat das gewissenhaft gemacht

Jonas Shinaniganz 30. Jul 2019 15:57

AW: csgo readprocessmemory, Speicher auslesen, Werte nicht wie erwartet
 
Ich kann ja nochmal mein Verständnis von readprocessmemory kommentieren

Delphi-Quellcode:
    ReadProcessMemory(phandle, // phandle habe ich über das Fenster und den zugehörigen Prozess ermittelt
                      Pointer(ClientDLL_Base + off_LocalPlayer), // die clientdll_base adresse wurde über den modul record mit CreateToolHelp32SnapShot ermittelt
                      @LocPlayer_Base, // ist Adresse der Pointer Variable LocPlayer_Base, welche vom typ NativeUInt ist und damit wohl geeigneter 64 Bit Pointer
                      sizeof(LocPlayer_Base), // 8 byte...
                      Val); // kann hierbei unbetrachtet bleiben

Neutral General 30. Jul 2019 16:10

AW: csgo readprocessmemory, Speicher auslesen, Werte nicht wie erwartet
 
Die Werte wurden auch am 26.07.2019 aktualisiert, also das scheint aktuell zu sein.

Auf der github Seite steht auf der Projektseite ein Beispiel. Du musst zuerst den ClientState auslesen.

An Adresse (Offset?)
Code:
public const Int32 dwClientState = 0x58ECFC;
ist ein Pointer zu dem ClientState struct (oder class). Den Liest du aus.
Dann addierst du auf den ausgelesenen Wert den Offset von
Code:
public const Int32 dwClientState_GetLocalPlayer = 0x180;
und liest von dieser adresse den pointer zu einer Funktion namens "GetLocalPlayer" aus.
Diese Funktion musst du dann wahrscheinlich aufrufen (?) und daher bekommst du dann den Pointer zum Player.
Soweit ich da Bescheid weiß, kann das aber eigentlich nur über einen Remote-Thread funktionieren.

Wenn du den hast kannst du mit dem Offset zu
Code:
public const Int32 m_iHealth = 0x100;
die Lebensenergie auslesen.

Ist also ein bisschen komplizierter als das was du da hast.

Edit: PS: Sowas ist interessant, aber du bettelst quasi VAC gebannt zu werden. Nur so als Hinweis/Warnung.

Jonas Shinaniganz 30. Jul 2019 16:29

AW: csgo readprocessmemory, Speicher auslesen, Werte nicht wie erwartet
 
hallo nochmal :)

Zitat:

Zitat von Neutral General (Beitrag 1438407)
Du musst zuerst den ClientState auslesen.

ich habe da 2 unterschiedliche Ansätze festgestellt
1. localplayer über clientdll_base + localplayer_offset
2. localplayer über (engine_dll_base + clientstate_offset) -> clientstate und dann (clientstate + localplayer_clientstate_offset) derefferenzieren

da spielen soweit ich weiß funktionspointer, welche ich dann nutzte um funktionen aufzurufen, keine rolle, ich wollte eigentlich nur speicher hart auslesen.

DieDolly 30. Jul 2019 16:32

AW: csgo readprocessmemory, Speicher auslesen, Werte nicht wie erwartet
 
Zitat:

Edit: PS: Sowas ist interessant, aber du bettelst quasi VAC gebannt zu werden. Nur so als Hinweis/Warnung.
Das wird vermutlich auch passieren wenn das Spiel erkennt, dass eine externe Anwendung den speicher ausspioniert.
Cheat-Tools machen ja auch nichts anderes als den Speicher auszulesen. sie bereiten ihn danach noch grafisch auf. Aber wie auch immer.

Jonas Shinaniganz 30. Jul 2019 16:40

AW: csgo readprocessmemory, Speicher auslesen, Werte nicht wie erwartet
 
Ich wollte wirklich nicht in die Cheat Entwicklung einsteigen aber wenigstens das HP auslesen würde ich nun doch gerne zu Ende bringen :stupid:

Update: jippy!

Delphi-Quellcode:
    var
      locPlayer_Base, clientstate_Base : DWORD;
      hp : Integer;

-----------------------------------------------
// so hat es geklappt, die Typen für die modul-Basis adressen sind wohl 32 bit DWORDS...
    ReadProcessMemory(phandle,
                      Pointer(ClientDLL_Base + off_LocalPlayer),
                      @locPlayer_Base,
                      sizeof(locPlayer_Base),
                      Val);
    Memo1.Lines.Add('locPlayer_Base : ' + Format('%d , %d', [locPlayer_Base, Val]));

    ReadProcessMemory(phandle,
                      Pointer(locPlayer_Base + off_iHealth),
                      @hp,
                      sizeof(hp),
                      Val);
    Memo1.Lines.Add('hp : ' + IntToStr(hp));


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz