Registriert seit: 21. Mai 2008
23 Beiträge
|
Re: Delphi WriteProcessMemory mit Offsets zum Pointer
21. Mai 2008, 16: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
|