Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 20:32 Uhr.
Seite 2 von 2     12   

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