Einzelnen Beitrag anzeigen

infY2k7

Registriert seit: 21. Mai 2008
23 Beiträge
 
#17

Re: Delphi WriteProcessMemory mit Offsets zum Pointer

  Alt 21. Mai 2008, 15:42
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
  Mit Zitat antworten Zitat