_Memory funktionen auf Win7 64Bit

12/29/2011 14:39 Asuramaru#1
Hallöle :)
Ich hab seid neuem nun Win7 64Bit, und musste feststellen das ich nicht wie gewohnt die NomadMemory.au3 nutzen kann.

Weder "_MemoryRead" noch "_MemoryPointerRead" geben mir ein richtiges Ergebniss raus.

auch die Verwendung von "SetPrivilege("SetDebugPrivilege",1)" brachte keinen Erfolg.

_MemoryPointerRead gibt mir außerdem die Adresse "0x00000000" zurück.
(Offsets etc. auch schon versucht zu tauschen, aber da es auf WinXP funktioniert hat muss es an was anderem liegen)



Außerdem wollte die AutoIT installation wohl nicht so :o
Ich kriege kein Contextmenü im Explorer für die au3 Dateien.
Sprich ist muss alles in Scite machen (Run, Compile)
12/29/2011 15:15 lolkop#2
autoit funktioniert unter 64bit systemen genauso gut, wie unter 32 bit systemen.

du solltest vielleicht überlegen, einfach selbst funktionen zur speichermanipulation zu schreiben, da die nomad udf ohnehin ausschließlig auf die winapis zugreifen.

der vorteil hier liegt darinn, das du die funktionen selbst denen bedürfnissen anpassen kannst.

hier mal ein kleines beispiel für die grundfunktionen:
Code:
Func OpenProcess($pid)
	Local $mid = DllCall('kernel32.dll', 'int', 'OpenProcess', 'int', 0x1F0FFF, 'int', 1, 'int', $pid)
	Return $mid[0]
EndFunc

Func WriteProcessMemory($process_hwnd, $adress, $data, $type = 'dword')
	Local $struct = DllStructCreate($type)
	DllStructSetData($struct, 1, $data)
	DllCall('kernel32.dll', 'int', 'WriteProcessMemory', 'int', $process_hwnd, 'int', $adress, 'int', DllStructGetPtr($struct), 'int', DllStructGetSize($struct), 'int', 0)
EndFunc

Func ReadProcessMemory($process_hwnd, $adress, $type = 'dword')
	Local $struct = DllStructCreate($type)
	DllCall('kernel32.dll', 'int', 'ReadProcessMemory', 'int', $process_hwnd, 'int', $adress, 'ptr', DllStructGetPtr($struct), 'int', DllStructGetSize($struct), 'int', '')
	Return DllStructGetData($struct, 1)
EndFunc

Func CloseHandle($hwnd)
	DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $hwnd)
EndFunc
12/29/2011 16:46 Asuramaru#3
Hab mir die NomadMemory.au3 nochmal angeguckt, und die nutzt doch auch die Kernel32.dll, weshalb mich etwas wundert wieso dein Beispiel funktioniert aber die Funktion in der Nomadmemory nicht.
(Ist nur etwas länger mit @error abfragen)

Hättest du denn auchnoch ein Beispiel für die Pointer? :)
12/29/2011 17:13 lolkop#4
Schau dir einfach an, was ein Pointer ist. Dafür braucht mein keine extra Funktion.

Da in der Regel ein Pointer für viele Offsets genutzt wird, ist es extrem ineffizient diesen Pointer jedes mal wieder neu auszulesen.
12/29/2011 18:17 Asuramaru#5
Wie soll ich denn einen Pointer auslesen wenn ich nicht weiß worauf dieser zeigt?
Alles was ich finde ist das ein Pointer ein "Zeiger" ist.
Hat mir aber im Grunde nicht geholfen, da ich trotzdem nicht weiß wie ich mithilfe der Offsets und den gegeben Funktionen nun auf die richtige Adresse kommen soll.
12/29/2011 19:13 lolkop#6
ein pointer zeigt auf einen speicherbereich. genauer genommen zeigt er auf den beginn eines speicherbereichs.

angenommen im speicher steht ein integer array mit 4 elementen (1,2,3,4).
integer bedeutet, das jeder eintrag im array genau 4 byte groß ist.

nehmen wir an, das array steht in der adresse 0x12345678.
im speicher sieht das ganze dann etwa so aus:
Code:
|    1    | |    2    | |    3    | |    4    |
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
nun hast du einen pointer gefunden der auf dieses array, bzw genauer gesagt auf das erste element dieses arrays zeigt.

dein pointer befindet sich zb an der stelle 0x1000 im speicher.

liest du jetzt 0x1000 aus, per ReadProcessMemory, so befindet sich darin die adresse, an welcher das array beginnt (0x12345678).

willst du jetzt das 3te element des arrays auslesen, so musst du nun das offset zum ausgelesenen wert hinzu addieren. da es sich um int werte handelt, ist jeder eintrag 4 byte vom vorherigen entfernt.

darauf würde sich folgender code ergeben:
Code:
$hwnd = OpenProcess(<prozess_id>)
$pointer = ReadProcessMemory($hwnd, 0x1000)
$array1 = ReadProcessMemory($hwnd, $pointer+0)
$array2 = ReadProcessMemory($hwnd, $pointer+4)
$array3 = ReadProcessMemory($hwnd, $pointer+8)
$array4 = ReadProcessMemory($hwnd, $pointer+12)
CloseHandle($hwnd)
die offsets werden also einfach auf die durch den pointer gegebene adresse addiert, und bilden die neue auszulesende adresse.