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/)
-   -   Delphi Memory Adress lesen (https://www.delphipraxis.net/152745-memory-adress-lesen.html)

MasterTobi 5. Jul 2010 08:36

Memory Adress lesen
 
hallo ich hab hier folgendes Problem

hier erstmal die adresse aus dem Ram

0xB6F5F0 - Player pointer (CPed)

This pointer:
+0 = Contains a pointer to the first element in the pool
+4 = Contains a pointer to a byte map indicating which elements are in use
+8 = [dword] Is the maximum number of elements in the pool
+12 = [dword] Is the current number of elements in the pool

Each ped object is 1988 (0x7C4) bytes.

For each ped in the pool:

In most cases, you can use even the dword of playeraddress as CPed value
CPed +0x14 = Pointer to XYZ position structure (and rotation)
(CPed+0x14) +0x0 to +0x2C = [dword] Is the rotation matrix
(CPed+0x14) +0x30 = [dword] XPos
(CPed+0x14) +0x34 = [dword] YPos
(CPed+0x14) +0x38 = [dword] ZPos


so nun möchte ich zb (CPed+0x14) +0x30 = [dword] XPos auslesen

ich mache dies so:
Delphi-Quellcode:
var i,x,y:integer;
cx,cy:dword;
begin
if ActiveCaption = 'GTA:SA:MP' then begin
WindowName :=FindWindow(nil,'GTA:SA:MP');
GetWindowThreadProcessId(WindowName ,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);



    ReadProcessMemory(HandleWindow ,ptr($B6F5F0+$14+$30 ),@i,4,cx);  //lesen aus einem Offset
  //lesen aus einem Offset
    label11.caption:=inttostr(i);
    closehandle(HandleWindow);
end;
end;
aber da kommen ganz andere werte raus :( also die xpos stimmt nicht wenn ich es so auslese wie hier

kann mir jemand helfen ?

Neutral General 5. Jul 2010 08:44

AW: Memory Adress lesen
 
Hallo,

Zitat:

CPed +0x14 = Pointer to XYZ position structure (and rotation)
Da steht, dass dort ein Pointer steht! D.h. du musst zuerst den Pointer auslesen:

Delphi-Quellcode:
ReadProcessMemory(HandleWindow ,Pointer($B6F5F0+$14),@i,SizeOf(Pointer),cx);

Danach kannst du die X-Position auslesen:
Delphi-Quellcode:
ReadProcessMemory(HandleWindow ,Pointer(i+$30),@x,SizeOf(DWORD),cx);

Gruß
Neutral General

MasterTobi 5. Jul 2010 09:00

AW: Memory Adress lesen
 
ahhhhhhhh nun verstehe ich :) vielen dank :)

nur noch eine frage was mich grad sehr wundert ist:

das jetzt im label11 eine 1 steht, es müsste aber eine 4 stellige zahl und gegebenfall ein das vorzeichen - erscheinen.

Delphi-Quellcode:
label11.caption:= inttostr(x)
ist wahrscheinlich auch noch falsch oder ?
der sagt jedes mal wenn ich zb nur
Delphi-Quellcode:
label11.caption:=x
error: [Fehler] Unit1.pas(640): E2010 Inkompatible Typen: 'string' und 'Integer'.

himitsu 5. Jul 2010 12:36

AW: Memory Adress lesen
 
Um es deutlich zu machen:
- es existiert in etwa nachfolgende Struktur
- dein Zeiger ist ein PPlayer
- und nun mußt du dich nur noch von PPlayer zum gewünschten Wert durcharbeiten
oder du kopierst einfach alles (und 3 Kopiergängen) in eine eigene Struktur rüber und liest darüber dann aus.

Delphi-Quellcode:
TPed = record
  irgendwas: array[0..4] of DWord;
  RotationMatrix: array[0..10] of DWord;
  XPos: DWord;
  YPos: DWord;
  ZPos: DWord;
  nochwach: array of [0..477] of DWord;
end;
PPed = ^TPed;

TPedArray = array[0..0] of TPed;
PPedArray = ^TPedArray;

TByteMap = array[0..0] of Byte;
PByteMap = ^TByteMap;

TPlayer = record
  Ped: PPedArray;
  PedMap: PByteMap;
  MaximumPeds: DWord;
  CurrentPeds: DWord;
end;
PPlayer = ^TPlayer;

MasterTobi 5. Jul 2010 12:53

AW: Memory Adress lesen
 
hm sry aber nu is versteh ich grad ma nur bahnhof :D bzw steh aufen schlauch oder sonst was :D

himitsu 5. Jul 2010 13:08

AW: Memory Adress lesen
 
Nja, diese Struktur entsteht, wenn man deine Beschreibung "übersetzt".

- mit ReadProcessMemory das TPlayer auslesen,
- dir di Werte von Player.Ped und Player.PedMap merken
- dann z.B. über GetMem, zusammen mit Player.MaximumPeds Speicher für Player.Ped und Player.PedMap bestellen und den Zeiger darin speichern
- und nun nur nocheinmal mit ReadProcessMemory .Ped und .PedMap auslesen, von den Positionen, welche man sich vorhin gemerkt hatte

und schon hast du eine eigene Kopie dieser Struktur und kannst damit machen, was du willst.

- wenn man dann das nicht mehr braucht, dann natürlich nicht vergessen den Speicher wieder freizugeben
(es sei denn man schummelt etwas und baut alles mit dynamischen Arrays auf :stupid: )


PS: [0..0] steht für ein statisches Array unbestimmter Größe (da schaltet der Compiler dann die Bereichprüfungen ab und es ist egal auf welchen Index zugegriffen wird) ... gut, wenn man die Größe noch nicht kennt.

die XPos von Player 0 ist dann Player.Ped[0].XPos

MasterTobi 6. Jul 2010 08:15

AW: Memory Adress lesen
 
mit ReadProcessMemory das TPlayer auslesen,

also
Delphi-Quellcode:
ReadProcessMemory(HandleWindow ,Tped($B6F5F0+$14),@i,sizeof(Tped),Wert);
aber dann sagt der mir [Fehler] Unit1.pas(672): E2089 Ungültige Typumwandlung (bei @i)

irgendwie bin ich wieder zu blöd für sowas :D

MasterTobi 19. Jul 2010 14:09

AW: Memory Adress lesen
 
sry für doppelpost aber
könnte mir net doch jemand noch dabei helfen, wie man das richtig macht ?

wäre total super :)

mfg

Neutral General 19. Jul 2010 14:45

AW: Memory Adress lesen
 
Hi,

Du musst als Buffer die Adresse eines TPed Records übergeben und als 2. Parameter erwartet er ein Rekord. Du kannst die Adresse nicht auf einen Pointer casten. Das geht technisch nicht und macht auch keinen Sinn.

Delphi-Quellcode:
var ped: TPed;
    p: Pointer;
begin
  ReadProcessMemory(HandleWindow, Pointer($B6F5F0+$14),@p,SizeOf(Pointer),Wert);
  ReadProcessMemory(HandleWindow, p, @ped, SizeOf(TPed), Wert);
  ShowMessage(Format('X: %d, Y: %d, Z: %d',[ped.XPos,ped.YPos,ped.ZPos]));
end;
Es kann sein, dass du TPed und alle anderen Records als "packed record" definieren musst, damit es richtig funktioniert. Ich würde dir das jedenfalls empfehlen.


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

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