AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memory Adress lesen

Ein Thema von MasterTobi · begonnen am 5. Jul 2010 · letzter Beitrag vom 19. Jul 2010
Antwort Antwort
MasterTobi

Registriert seit: 29. Apr 2007
212 Beiträge
 
#1

Memory Adress lesen

  Alt 5. Jul 2010, 09:36
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:MPthen 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 ?
MFG
Tobi
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Memory Adress lesen

  Alt 5. Jul 2010, 09:44
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:

ReadProcessMemory(HandleWindow ,Pointer($B6F5F0+$14),@i,SizeOf(Pointer),cx);
Danach kannst du die X-Position auslesen:
ReadProcessMemory(HandleWindow ,Pointer(i+$30),@x,SizeOf(DWORD),cx);
Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 5. Jul 2010 um 09:46 Uhr)
  Mit Zitat antworten Zitat
MasterTobi

Registriert seit: 29. Apr 2007
212 Beiträge
 
#3

AW: Memory Adress lesen

  Alt 5. Jul 2010, 10:00
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.

label11.caption:= inttostr(x) ist wahrscheinlich auch noch falsch oder ?
der sagt jedes mal wenn ich zb nur label11.caption:=x error: [Fehler] Unit1.pas(640): E2010 Inkompatible Typen: 'string' und 'Integer'.
MFG
Tobi
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Memory Adress lesen

  Alt 5. Jul 2010, 13:36
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;
$2B or not $2B
  Mit Zitat antworten Zitat
MasterTobi

Registriert seit: 29. Apr 2007
212 Beiträge
 
#5

AW: Memory Adress lesen

  Alt 5. Jul 2010, 13:53
hm sry aber nu is versteh ich grad ma nur bahnhof bzw steh aufen schlauch oder sonst was
MFG
Tobi
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Memory Adress lesen

  Alt 5. Jul 2010, 14:08
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 )


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
$2B or not $2B

Geändert von himitsu ( 5. Jul 2010 um 14:11 Uhr)
  Mit Zitat antworten Zitat
MasterTobi

Registriert seit: 29. Apr 2007
212 Beiträge
 
#7

AW: Memory Adress lesen

  Alt 6. Jul 2010, 09:15
mit ReadProcessMemory das TPlayer auslesen,

also
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
MFG
Tobi
  Mit Zitat antworten Zitat
MasterTobi

Registriert seit: 29. Apr 2007
212 Beiträge
 
#8

AW: Memory Adress lesen

  Alt 19. Jul 2010, 15:09
sry für doppelpost aber
könnte mir net doch jemand noch dabei helfen, wie man das richtig macht ?

wäre total super

mfg
MFG
Tobi
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Memory Adress lesen

  Alt 19. Jul 2010, 15:45
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (19. Jul 2010 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 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