|
You last visited: Today at 04:32
Advertisement
_Memory funktionen auf Win7 64Bit
Discussion on _Memory funktionen auf Win7 64Bit within the AutoIt forum part of the Coders Den category.
12/29/2011, 14:39
|
#1
|
elite*gold: 20
Join Date: Nov 2009
Posts: 2,256
Received Thanks: 1,570
|
_Memory funktionen auf Win7 64Bit
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
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
|
#2
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
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
|
#3
|
elite*gold: 20
Join Date: Nov 2009
Posts: 2,256
Received Thanks: 1,570
|
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
|
#4
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
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
|
#5
|
elite*gold: 20
Join Date: Nov 2009
Posts: 2,256
Received Thanks: 1,570
|
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
|
#6
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
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.
|
|
|
|
Similar Threads
|
Pointer.au3 funktionen auf 64Bit
11/24/2011 - AutoIt - 4 Replies
Global $OffsetFee =
Global $Static = Dec("244AFC")
$MemOpen = _MemoryOpen(ProcessExists("NostaleX.dat" ))
$BaseAddr = _MemoryGetBaseAddress($MemOpen, 1)
$Addr = "0x" & Hex($BaseAddr + $Static)
_MemoryPointerWrite($Addr, $MemOpen, $OffsetFee, $Fee, "dword")
_MemoryClose($MemOpen)
Mein Problem besteht dadrin das der oben gezeigte teil auf 32bit Versionen Problemlos funktioniert aber auf Win7/Vista mit 64bit nicht.
|
Probs mit _Memory Funktionen
10/16/2010 - Nostale - 6 Replies
Hi, ich hab schon vor einiger zeit ma aus lw nen memorybot gescriptet, jedoch
macht er nicht dass, was im script steht. Er erkennt die werte (bereits in .ini schreiben lassen und waren richtig), aber führt danach nicht die ensprechende Tätigkeit aus.hier mal das Script:Link
die library.au3 is bloß ne datei, die alle dateien im include-ordner includet.
ist ebenfalls mit meiner NomadMemory.au3 dabei.
Bitte um Erklärung und mögliche Lösungen. THX^^
|
Probs mit _Memory Funktionen
10/11/2010 - Nostale - 1 Replies
Hi, ich hab schon vor einiger zeit ma aus lw nen memorybot gescriptet, jedoch
macht er nicht dass, was im script steht. Er erkennt die werte (bereits in .ini schreiben lassen und waren richtig), aber führt danach nicht die ensprechende Tätigkeit aus.hier mal das Script:
die library.au3 is bloß ne datei, die alle dateien im include-ordner includet.
ist ebenfalls mit meiner NomadMemory.au3 dabei.
Bitte um Erklärung und mögliche Lösungen. THX^^
|
All times are GMT +2. The time now is 04:32.
|
|