_MemoryPointerRead (autoit) in delphi

05/21/2008 16:49 infY2k7#1
Hallo epvp coder Gruppe

Ich hänge derzeit an folgendem Problem:
In auto-it konnte man mit der "_MemoryPointerRead" Funktion einen Wert aus dem Speicher auslesen, zu dem man nur über einen Pointer(mit Offsets usw.) kommt.
[Only registered and activated users can see links. Click Here To Register...]
Nachdem ich in einem anderem Forum keinen fand, der davon Ahnung hatte, frage ich hier:
Gibt es soetwas auch in Delphi? Ich verwende derzeit die Funktion
"ReadProcessMemory", die jedoch nur Werte aus statischen Adressen auslesen kann, was also sogut wie garnichts bringt.

Hier mal die Funktion in autoit:
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

Bitte um Hilfe, mfg infY
05/21/2008 17:05 mr.rattlz#2
Die von die gepostete Funktion benutzt doch auch nur ReadProcessMemory oder nicht?
Wenn du nur die Adresse von einem Pointer hast, dann liest du halt mit ReadProcessMemory diese Adresse und nimmst dann den Pointer als Adresse um mit ReadProcessMemory zu lesen.
05/21/2008 17:39 infY2k7#3
nein, ich hab die adresse vom pointer und dazu 2 offsets(siehe bild) die frage ist nun, wie ich delphi dazu bringe, die offsets mit zu beachten...
05/22/2008 00:14 wadimwadim#4
Ja, so etwas gibs in delphi, frag die member von DP :) .
05/22/2008 11:02 mr.rattlz#5
Jetzt verstehe ich endlich, was du vorhast, das ist nahezu das selbe, nur, dass du dein Offset halt draufaddierst. Addition sollte für gewöhnlich aber keine Magie sein ;)
05/22/2008 13:58 reijin#6
wie rattlz schon sagte:
du liest den wert den der pointer hat aus.
du addierst zum erhaltenen wert den offset-wert -> du erhälst die momentane Adresse
readprocessmemory auf die über den pointer gefundene adresse ansetzen - fertig
05/23/2008 14:03 infY2k7#7
Quote:
Originally Posted by Reijin View Post
wie rattlz schon sagte:
du liest den wert den der pointer hat aus.
du addierst zum erhaltenen wert den offset-wert -> du erhälst die momentane Adresse
readprocessmemory auf die über den pointer gefundene adresse ansetzen - fertig
bämmm das wars!! ich hab nur die adresse des pointers mit dem offset addiert, ich muss den wert addieren!! thx :cool: