![]() |
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:
aber da kommen ganz andere werte raus :( also die xpos stimmt nicht wenn ich es so auslese wie hier
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; kann mir jemand helfen ? |
AW: Memory Adress lesen
Hallo,
Zitat:
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 |
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:
ist wahrscheinlich auch noch falsch oder ?
label11.caption:= inttostr(x)
der sagt jedes mal wenn ich zb nur
Delphi-Quellcode:
error: [Fehler] Unit1.pas(640): E2010 Inkompatible Typen: 'string' und 'Integer'.
label11.caption:=x
|
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; |
AW: Memory Adress lesen
hm sry aber nu is versteh ich grad ma nur bahnhof :D bzw steh aufen schlauch oder sonst was :D
|
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 |
AW: Memory Adress lesen
mit ReadProcessMemory das TPlayer auslesen,
also
Delphi-Quellcode:
aber dann sagt der mir [Fehler] Unit1.pas(672): E2089 Ungültige Typumwandlung (bei @i)
ReadProcessMemory(HandleWindow ,Tped($B6F5F0+$14),@i,sizeof(Tped),Wert);
irgendwie bin ich wieder zu blöd für sowas :D |
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 |
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:
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.
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; |
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