Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Delphi WriteProcessMemory mit Offsets zum Pointer (https://www.delphipraxis.net/114207-delphi-writeprocessmemory-mit-offsets-zum-pointer.html)

infY2k7 21. Mai 2008 12:59


Delphi WriteProcessMemory mit Offsets zum Pointer
 
Hallo Leute, ich hab folgendes Problem:
Ich möchte etwas in den Speicher eines Spiels schreiben, was auch kein Problem ist, solange es eine statische Adresse ist, wie z.B.:
Delphi-Quellcode:
ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
GetMem(buf,1);
buf^  := Chr($1); //Der Wert ist also $1
FreeMem(buf);
WriteProcessMemory(HandleWindow,ptr($9451524),buf,size,write); //Adresse $123456 ist statisch!
closehandle(HandleWindow);
Jedoch ändert sich diese Adresse bei jedem Spielstart, weshalb ich einen Pointer benutzen muss:

$9451524 mit den Offsets:
+20
+bcc
+10
+38 (alle als hexadezimal)

um zu der Adresse zu kommen.

Wie kann ich in die WriteProcessMemory Funktion diese Offsets einbinden? Oder benötige ich dazu eine andere Funktion?

danke im Vorraus, infy

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen - Mfg, SirThornberry[/edit]

SirThornberry 21. Mai 2008 13:04

Re: Pointer-Problem
 
Hallo infY2k7 - Willkommen in der DP :dp:
Könntest du deinem Beitrag bitte einen aussagekräftigeren Titel geben? Mit http://www.delphipraxis.net/template.../icon_edit.gif über deinem Beitrag kannst du diesen ändern.

Daniel 21. Mai 2008 13:05

Re: Pointer-Problem
 
Moin und willkommen in der DP,

an manchen Tagen kommt's echt knüppeldicke. Du hast Dir den Code offenbar zusammengesucht und herzlich wenig Ahnung davon, wie er arbeitet. Im fremden Prozessen herumzuschreubbeln ist meist nichts für Einsteiger.

Du kannst Deine konstante Adresse aus dem ersten Beispiel in eine Variable überführen. Der Typ DWORD könnte ganz gut geeignet sein. Und wenn Du die Adresse schon in einer Variablen hast, kannst Du auch damit rechnen.

Wo genau ist Deine Frage? Wenn Du diese Antwort hast, kannst Du auch Deinem Thema einen aussagekräftigen Titel geben. Danke Dir. :-)

infY2k7 21. Mai 2008 13:09

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
ich hab das bisher alles in auto-it gemacht, aber delphi bietet mehr möglichkeiten, deswegen möchte ich umsteigen!

ja das problem ist, ich kann nicht mit einer einfachen adresse arbeiten, da sich diese bei jedem spielstart ändert. ein pointer ist nötig, die basis-adresse des pointers lautet 9451524 und diese führt mit den oben genannten offsets zu der adresse, die ich brauche!
bsp: health-point anzeige im spiel ist gerad in der adresse 1111111. wenn ich spiel neu starte in 132475 usw. der pointer 9451524 + die offsets von oben, zeigt jedoch jedesmal auf die richtige adresse! in delphi möchte ich also mit der writeprocessmemory funktion irgendwie auf die richtige adresse kommen! klingt komisch, is aber so ;)

SirThornberry 21. Mai 2008 13:12

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
Als erstes musst du deinen Quelltext verstehen. Im Moment macht er keinen Sinn. Du holst dir zum Beispiel Speicher für Buf von 1 Byte Größe, schreibst etwas in den Speicher und gibst dieses 1 Byte speicher wieder frei.
Danach rufst du WriteProcessMemory auf und übergibst Buf obwohl der Speicher dafür ja schon wieder frei gegeben ist. Du siehst, das ganze macht überhaupt keinen Sinn.

infY2k7 21. Mai 2008 13:14

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
ich hab das auch nur aus einem anderem thread, da ich in der schule noch nichts zu memory write usw. gelernt habe, aber so wie es da oben steht, kann ich schon bestimmte werte in statischen adressen ändern, das funktioniert schon ;)
btw danke für die schnellen antworten!

Daniel 21. Mai 2008 13:15

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
Naja, mit Deinem Beispiel aus dem ersten Beitrag bist Du doch schon recht weit.

Also: Eine neue Variable muss her, vom Typ DWORD (LongWord). Und dann kannst Du einfach zuweisen und rechnen: myVariable:= $9451524 + $20. In Deinem Code ersetzt Du dann die Konstante durch myVariable und gut is'.

Dann würde ich Dir raten, das Ganze in einer Funktion zu verpacken und die gewünschte Adresse als Parameter zu übergeben.

Wenn Du nicht genau weißt, wie Du Variablen deklariert oder Funktionen erstellst, dann empfehle ich http://www.delphi-treff.de/tutorials...-fange-ich-an/.

:-)

infY2k7 21. Mai 2008 13:17

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
das ist schon eine prozedur, hab hier nur nen ausschnitt draus reingestellt und die variablen mit werten ersetzt. danke, ich probier das mal!
mfg infy

Nuclear-Ping 21. Mai 2008 13:18

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
Zitat:

Zitat von infY2k7
ich hab das auch nur aus einem anderem thread, da ich in der schule noch nichts zu memory write usw. gelernt habe, aber so wie es da oben steht, kann ich schon bestimmte werte in statischen adressen ändern, das funktioniert schon ;)
btw danke für die schnellen antworten!

Zu "Memory Write" wirst du wahrscheinlich auch nichts in der Schule lernen, leider.

Und dass es funktioniert ist Zufall, weil wahrscheinlich noch in der Adresse zufällig der Wert steht, obwohl sie schon freigegeben wurde. Trotzdem ist es programmiertechnisch gesehen fataler Unsinn, auf bereits freigegebene Speicherbereiche zuzugreifen.

infY2k7 21. Mai 2008 13:19

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
wie kann ich das besser schreiben? also hier mal meine prozedur:

Delphi-Quellcode:
procedure p_memorywrite(value,size:integer;adresse:dword);
begin
    ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
    HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
    GetMem(buf,1);
    buf^  := Chr(value);
    FreeMem(buf);
    WriteProcessMemory(HandleWindow,ptr(adresse),buf,size,write);
    closehandle(HandleWindow);
end;

Nuclear-Ping 21. Mai 2008 13:22

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
Delphi-Quellcode:
procedure p_memorywrite(value,size:integer;adresse:dword);
begin
    GetMem(buf,1);
    ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
    HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
    try
      buf^  := Chr(value);
      WriteProcessMemory(HandleWindow,ptr(adresse),buf,size,write);
    finally
      FreeMem(buf);
      closehandle(HandleWindow);
    end;
end;

Daniel 21. Mai 2008 13:26

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
oha. ;-)

Sagen wir es mal so - Dein Code hat gewisse Entfaltungsmöglichkeiten. Ich werde ihn Dir nicht neu schreiben, habe aber ein paar Anregungen:

- Wo kommen "WindowName" und "ProcessId" her? Globale Variablen sind i.a. "pfui".
- Wenn Du eine Funktion wie "GetWindowThreadProcessId" oder "openProcess" aufrufst, muss Du immer damit rechnen, dass diese Funktionen fehlschlagen. Also das Ergebnis dieser Funktionen prüfen, ob ein Fehlercode geliefert wurde. (Google: msdn + {funktionsname} führt Dich zur Doku)
- "Chr(value)" versucht, den in Value enthaltenen Wert in den Datentyp Character zu pressen. Die klassischen Charakters konnten aber nur Werte bis 255 - Dein Value, vom Typ intger, kann deutlich mehr. Was passiert bei größeren Werten? Das solltest Du berücksichtigen. In Zeiten von Unicode ist ein Zeichen nicht mehr unbedingt ein Byte lang. Du reservierst ein Byte an Speicher, schreibst aber u.U. deutlich mehr in diesen Bereich und verletzt damit umliegende Bereiche.

Nur so auf die Schnelle.

infY2k7 21. Mai 2008 13:32

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
der code von nuclear läuft schonmal!
aber eine frage habe ich trotzdem noch: kann ich diese funktion genauso übernehmen, bloß mit readprocessmemory?
für die, die nicht genau wissen, was ich meine hier mal ein bild:

http://1337files.13.funpic.de/ce.jpg

der pointer ist hier:00903804
offsets:+20+450
pointet zur adresse 053080c0
den wert, der dann in dieser adresse ist, möchte ich auslesen!
mfg infy

Daniel 21. Mai 2008 13:37

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
Zitat:

Zitat von infY2k7
aber eine frage habe ich trotzdem noch: kann ich diese funktion genauso übernehmen, bloß mit readprocessmemory?

Was hält Dich davon ab, es zu probieren?

SirThornberry 21. Mai 2008 13:37

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
du musst den Quelltext verstehen! Dann weißt du auch ob es mit ReadProcessMemory funktioniert. Es macht absolut keinen Sinn das du Quelltext verwendest ohne zu wissen was da genau passiert. Dabei lernst du rein gar nichts. Nur wenn du den Quelltext auch verstehst kann am Ende was sinnvolles dabei raus kommen.

infY2k7 21. Mai 2008 13:42

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
hast recht, das wars also ersmal bis hier, den rest krieg ich schon irgendwie hin!
danke für eure hilfe mfg infy

infY2k7 21. Mai 2008 15:42

Re: Delphi WriteProcessMemory mit Offsets zum Pointer
 
Zitat:

Zitat von Daniel
Naja, mit Deinem Beispiel aus dem ersten Beitrag bist Du doch schon recht weit.

Also: Eine neue Variable muss her, vom Typ DWORD (LongWord). Und dann kannst Du einfach zuweisen und rechnen: myVariable:= $9451524 + $20. In Deinem Code ersetzt Du dann die Konstante durch myVariable und gut is'.

Dann würde ich Dir raten, das Ganze in einer Funktion zu verpacken und die gewünschte Adresse als Parameter zu übergeben.

Wenn Du nicht genau weißt, wie Du Variablen deklariert oder Funktionen erstellst, dann empfehle ich http://www.delphi-treff.de/tutorials...-fange-ich-an/.

:-)

Hab das mit write und read memory nun halbwegs hinbekommen! Aber: wenn ich nun $00903804+$20 rechnen lasse, dann kommt raus 9451556! jedoch ist das mehr oder weniger sinnlos, da ein pointer ja zu einer adresse zeigt, die sich ständig ändert, jedoch würde diese adresse immer gleich sein!
bei meinem problem zeigt der pointer $00903804 mit dem offset $20 auf die adresse 0320ADD8(siehe bild)
http://1337files.13.funpic.de/ce.jpg
was ich brauche, wäre also eine funktion in delphi, die das mit den pointern geregelt kriegt. zum vergleich,
in autoit sah die funktion so aus:

Delphi-Quellcode:
Func _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset, $sv_Type = 'dword')
   
   If IsArray($av_Offset) Then
      If IsArray($ah_Handle) Then
         Local $iv_PointerCount = UBound($av_Offset) - 1
      Else
         SetError(2)
         Return 0
      EndIf
   Else
      SetError(1)
      Return 0
   EndIf
   
   Local $iv_Data[2], $i
   Local $v_Buffer = DllStructCreate('dword')
   
   For $i = 0 to $iv_PointerCount
      
      If $i = $iv_PointerCount Then
         $v_Buffer = DllStructCreate($sv_Type)
         If @Error Then
            SetError(@Error + 2)
            Return 0
         EndIf
         
         $iv_Address = '0x' & hex($iv_Data[1] + $av_Offset[$i])
         DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
         If @Error Then
            SetError(7)
            Return 0
         EndIf
         
         $iv_Data[1] = DllStructGetData($v_Buffer, 1)
         
      ElseIf $i = 0 Then
         DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
         If @Error Then
            SetError(7)
            Return 0
         EndIf
         
         $iv_Data[1] = DllStructGetData($v_Buffer, 1)
         
      Else
         $iv_Address = '0x' & hex($iv_Data[1] + $av_Offset[$i])
         DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
         If @Error Then
            SetError(7)
            Return 0
         EndIf
         
         $iv_Data[1] = DllStructGetData($v_Buffer, 1)
         
      EndIf
      
   Next
   
   $iv_Data[0] = $iv_Address
   
   Return $iv_Data

EndFunc
ist also doch nicht so leicht, wie ich dachte! bitte um hilfe, mfg infy


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 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