|
You last visited: Today at 20:24
Advertisement
Memory benutzen
Discussion on Memory benutzen within the AutoIt forum part of the Coders Den category.
03/27/2013, 16:31
|
#1
|
elite*gold: 0
Join Date: Mar 2010
Posts: 7
Received Thanks: 1
|
Memory benutzen
Hallo Leute,
Ich habe ein großes, kleines Problem
Ich habe mit cheatengine eine Adresse ausgelesen.
Diese wollte ich einsetzen um mit autoit in einem bestimmten Bereich danach zu suchen... Allerdings finde ich nichts dazu, wie oder wo ich die ausgelesene Adresse einsetzen kann ..
Ich hoffe Ihr könnt euch in mein Problem reindenken und könnt mir weiterhelfen.
Mit freundlichem Gruß
Timo
|
|
|
03/27/2013, 16:50
|
#2
|
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
|
Erstmal brauchst du die NomadMemory.au3:
Code:
;=================================================================================================
; Function: _MemoryOpen($iv_Pid[, $iv_DesiredAccess[, $iv_InheritHandle]])
; Description: Opens a process and enables all possible access rights to the process. The
; Process ID of the process is used to specify which process to open. You must
; call this function before calling _MemoryClose(), _MemoryRead(), or _MemoryWrite().
; Parameter(s): $iv_Pid - The Process ID of the program you want to open.
; $iv_DesiredAccess - (optional) Set to 0x1F0FFF by default, which enables all
; possible access rights to the process specified by the
; Process ID.
; $if_InheritHandle - (optional) If this value is TRUE, all processes created by
; this process will inherit the access handle. Set to TRUE
; (1) by default. Set to 0 if you want it to be FALSE.
; Requirement(s): A valid process ID.
; Return Value(s): On Success - Returns an array containing the Dll handle and an open handle to
; the specified process.
; On Failure - Returns 0
; @Error - 0 = No error.
; 1 = Invalid $iv_Pid.
; 2 = Failed to open Kernel32.dll.
; 3 = Failed to open the specified process.
; Author(s): Nomad
; Note(s):
;=================================================================================================
Func _MemoryOpen($iv_Pid, $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1)
If Not ProcessExists($iv_Pid) Then
SetError(1)
Return 0
EndIf
Local $ah_Handle[2] = [DllOpen('kernel32.dll')]
If @Error Then
SetError(2)
Return 0
EndIf
Local $av_OpenProcess = DllCall($ah_Handle[0], 'int', 'OpenProcess', 'int', $iv_DesiredAccess, 'int', $if_InheritHandle, 'int', $iv_Pid)
If @Error Then
DllClose($ah_Handle[0])
SetError(3)
Return 0
EndIf
$ah_Handle[1] = $av_OpenProcess[0]
Return $ah_Handle
EndFunc
;=================================================================================================
; Function: _MemoryRead($iv_Address, $ah_Handle[, $sv_Type])
; Description: Reads the value located in the memory address specified.
; Parameter(s): $iv_Address - The memory address you want to read from. It must be in hex
; format (0x00000000).
; $ah_Handle - An array containing the Dll handle and the handle of the open
; process as returned by _MemoryOpen().
; $sv_Type - (optional) The "Type" of value you intend to read. This is set to
; 'dword'(32bit(4byte) signed integer) by default. See the help file
; for DllStructCreate for all types.
; An example: If you want to read a word that is 15 characters in
; length, you would use 'char[16]'.
; Requirement(s): The $ah_Handle returned from _MemoryOpen.
; Return Value(s): On Success - Returns the value located at the specified address.
; On Failure - Returns 0
; @Error - 0 = No error.
; 1 = Invalid $ah_Handle.
; 2 = $sv_Type was not a string.
; 3 = $sv_Type is an unknown data type.
; 4 = Failed to allocate the memory needed for the DllStructure.
; 5 = Error allocating memory for $sv_Type.
; 6 = Failed to read from the specified process.
; Author(s): Nomad
; Note(s): Values returned are in Decimal format, unless specified as a 'char' type, then
; they are returned in ASCII format. Also note that size ('char[size]') for all
; 'char' types should be 1 greater than the actual size.
;=================================================================================================
Func _MemoryRead($iv_Address, $ah_Handle, $sv_Type = 'dword')
If Not IsArray($ah_Handle) Then
SetError(1)
Return 0
EndIf
Local $v_Buffer = DllStructCreate($sv_Type)
If @Error Then
SetError(@Error + 1)
Return 0
EndIf
DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If Not @Error Then
Local $v_Value = DllStructGetData($v_Buffer, 1)
Return $v_Value
Else
SetError(6)
Return 0
EndIf
EndFunc
;=================================================================================================
; Function: _MemoryWrite($iv_Address, $ah_Handle, $v_Data[, $sv_Type])
; Description: Writes data to the specified memory address.
; Parameter(s): $iv_Address - The memory address you want to write to. It must be in hex
; format (0x00000000).
; $ah_Handle - An array containing the Dll handle and the handle of the open
; process as returned by _MemoryOpen().
; $v_Data - The data to be written.
; $sv_Type - (optional) The "Type" of value you intend to write. This is set to
; 'dword'(32bit(4byte) signed integer) by default. See the help file
; for DllStructCreate for all types.
; An example: If you want to write a word that is 15 characters in
; length, you would use 'char[16]'.
; Requirement(s): The $ah_Handle returned from _MemoryOpen.
; Return Value(s): On Success - Returns 1
; On Failure - Returns 0
; @Error - 0 = No error.
; 1 = Invalid $ah_Handle.
; 2 = $sv_Type was not a string.
; 3 = $sv_Type is an unknown data type.
; 4 = Failed to allocate the memory needed for the DllStructure.
; 5 = Error allocating memory for $sv_Type.
; 6 = $v_Data is not in the proper format to be used with the "Type"
; selected for $sv_Type, or it is out of range.
; 7 = Failed to write to the specified process.
; Author(s): Nomad
; Note(s): Values sent must be in Decimal format, unless specified as a 'char' type, then
; they must be in ASCII format. Also note that size ('char[size]') for all
; 'char' types should be 1 greater than the actual size.
;=================================================================================================
Func _MemoryWrite($iv_Address, $ah_Handle, $v_Data, $sv_Type = 'dword')
If Not IsArray($ah_Handle) Then
SetError(1)
Return 0
EndIf
Local $v_Buffer = DllStructCreate($sv_Type)
If @Error Then
SetError(@Error + 1)
Return 0
Else
DllStructSetData($v_Buffer, 1, $v_Data)
If @Error Then
SetError(6)
Return 0
EndIf
EndIf
DllCall($ah_Handle[0], 'int', 'WriteProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If Not @Error Then
Return 1
Else
SetError(7)
Return 0
EndIf
EndFunc
;=================================================================================================
; Function: _MemoryClose($ah_Handle)
; Description: Closes the process handle opened by using _MemoryOpen().
; Parameter(s): $ah_Handle - An array containing the Dll handle and the handle of the open
; process as returned by _MemoryOpen().
; Requirement(s): The $ah_Handle returned from _MemoryOpen.
; Return Value(s): On Success - Returns 1
; On Failure - Returns 0
; @Error - 0 = No error.
; 1 = Invalid $ah_Handle.
; 2 = Unable to close the process handle.
; Author(s): Nomad
; Note(s):
;=================================================================================================
Func _MemoryClose($ah_Handle)
If Not IsArray($ah_Handle) Then
SetError(1)
Return 0
EndIf
DllCall($ah_Handle[0], 'int', 'CloseHandle', 'int', $ah_Handle[1])
If Not @Error Then
DllClose($ah_Handle[0])
Return 1
Else
DllClose($ah_Handle[0])
SetError(2)
Return 0
EndIf
EndFunc
;=================================================================================================
; Function: _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset[, $sv_Type])
; Description: Reads a chain of pointers and returns an array containing the destination
; address and the data at the address.
; Parameter(s): $iv_Address - The static memory address you want to start at. It must be in
; hex format (0x00000000).
; $ah_Handle - An array containing the Dll handle and the handle of the open
; process as returned by _MemoryOpen().
; $av_Offset - An array of offsets for the pointers. Each pointer must have an
; offset. If there is no offset for a pointer, enter 0 for that
; array dimension.
; $sv_Type - (optional) The "Type" of data you intend to read at the destination
; address. This is set to 'dword'(32bit(4byte) signed integer) by
; default. See the help file for DllStructCreate for all types.
; Requirement(s): The $ah_Handle returned from _MemoryOpen.
; Return Value(s): On Success - Returns an array containing the destination address and the value
; located at the address.
; On Failure - Returns 0
; @Error - 0 = No error.
; 1 = $av_Offset is not an array.
; 2 = Invalid $ah_Handle.
; 3 = $sv_Type is not a string.
; 4 = $sv_Type is an unknown data type.
; 5 = Failed to allocate the memory needed for the DllStructure.
; 6 = Error allocating memory for $sv_Type.
; 7 = Failed to read from the specified process.
; Author(s): Nomad
; Note(s): Values returned are in Decimal format, unless a 'char' type is selected.
; Set $av_Offset like this:
; $av_Offset[0] = NULL (not used)
; $av_Offset[1] = Offset for pointer 1 (all offsets must be in Decimal)
; $av_Offset[2] = Offset for pointer 2
; etc...
; (The number of array dimensions determines the number of pointers)
;=================================================================================================
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
;=================================================================================================
; Function: _MemoryPointerWrite ($iv_Address, $ah_Handle, $av_Offset, $v_Data[, $sv_Type])
; Description: Reads a chain of pointers and writes the data to the destination address.
; Parameter(s): $iv_Address - The static memory address you want to start at. It must be in
; hex format (0x00000000).
; $ah_Handle - An array containing the Dll handle and the handle of the open
; process as returned by _MemoryOpen().
; $av_Offset - An array of offsets for the pointers. Each pointer must have an
; offset. If there is no offset for a pointer, enter 0 for that
; array dimension.
; $v_Data - The data to be written.
; $sv_Type - (optional) The "Type" of data you intend to write at the destination
; address. This is set to 'dword'(32bit(4byte) signed integer) by
; default. See the help file for DllStructCreate for all types.
; Requirement(s): The $ah_Handle returned from _MemoryOpen.
; Return Value(s): On Success - Returns the destination address.
; On Failure - Returns 0.
; @Error - 0 = No error.
; 1 = $av_Offset is not an array.
; 2 = Invalid $ah_Handle.
; 3 = Failed to read from the specified process.
; 4 = $sv_Type is not a string.
; 5 = $sv_Type is an unknown data type.
; 6 = Failed to allocate the memory needed for the DllStructure.
; 7 = Error allocating memory for $sv_Type.
; 8 = $v_Data is not in the proper format to be used with the
; "Type" selected for $sv_Type, or it is out of range.
; 9 = Failed to write to the specified process.
; Author(s): Nomad
; Note(s): Data written is in Decimal format, unless a 'char' type is selected.
; Set $av_Offset like this:
; $av_Offset[0] = NULL (not used, doesn't matter what's entered)
; $av_Offset[1] = Offset for pointer 1 (all offsets must be in Decimal)
; $av_Offset[2] = Offset for pointer 2
; etc...
; (The number of array dimensions determines the number of pointers)
;=================================================================================================
Func _MemoryPointerWrite ($iv_Address, $ah_Handle, $av_Offset, $v_Data, $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_StructData, $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 + 3)
Return 0
EndIf
DllStructSetData($v_Buffer, 1, $v_Data)
If @Error Then
SetError(8)
Return 0
EndIf
$iv_Address = '0x' & hex($iv_StructData + $av_Offset[$i])
DllCall($ah_Handle[0], 'int', 'WriteProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If @Error Then
SetError(9)
Return 0
Else
Return $iv_Address
EndIf
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(3)
Return 0
EndIf
$iv_StructData = DllStructGetData($v_Buffer, 1)
Else
$iv_Address = '0x' & hex($iv_StructData + $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(3)
Return 0
EndIf
$iv_StructData = DllStructGetData($v_Buffer, 1)
EndIf
Next
EndFunc
Kopier den Code füge es in eine .au3 ein die NomadMemory heißt
und lege sie in den Includes Ordner von AutoIt.
(Pfad bei mir: C:\Program Files (x86)\AutoIt3\Include)
Und dann musst du erstmal mit:
Code:
#RequireAdmin;Für Admin-rechte
#include <NomadMemory.au3> ;Um die Befehle zu nutzen
Global $Adresse = 0xADRESSE , $Process = "Process.exe"
$PID = ProcessExist($Process) ;Schauen ob Process existiert wenn ja gibt es den PID zurück
$hMem = _MemoryOpen($PID);Öffnet die Memory
$Read = _MemoryRead($Adresse , $hMem , "dword") ;Liest die Adresse aus
MsgBox(64 , "Value der Adresse" , $Read) ;Gibt den Wert aus
Bei $Adresse schreibst du deine Adresse hin mit 0x.
Bei $Process schreibst du den Process hin, z.b Solitaire.exe.
Bei _MemoryRead: "dword" ist 4Byte.
|
|
|
03/27/2013, 17:33
|
#3
|
elite*gold: 0
Join Date: Mar 2010
Posts: 7
Received Thanks: 1
|
Es funktioniert nicht er sag mir ne Fehlermeldung:
$PID = ProcessExist($Process)
$PID = ^ERROR
Error:Unknown function name.
Aber ich hab den Code unter Programme(x86)\Autoit3\Include gespeichert...
Code:
#RequireAdmin;Für Admin-rechte
#include <NomadMemory.au3> ;Um die Befehle zu nutzen
Global $Adresse = 0x0048BD44 , $Process = "SpiderSolitaire.exe"
$PID = ProcessExist($Process) ;Schauen ob Process existiert wenn ja gibt es den PID zurück
$hMem = _MemoryOpen($PID);Öffnet die Memory
$Read = _MemoryRead($Adresse , $hMem , "dword") ;Liest die Adresse aus
MsgBox(64 , "Value der Adresse" , $Read) ;Gibt den Wert aus
|
|
|
03/27/2013, 17:37
|
#4
|
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
|
Ja sorry, habe bei ProcessExist das "S" vergessen also:
Das hättest du eig. merken müssen.
Steht da ja sogar, Unknown Function Name:
Unügltiger Funktion Name.
|
|
|
03/27/2013, 17:45
|
#5
|
elite*gold: 0
Join Date: Mar 2010
Posts: 7
Received Thanks: 1
|
Oh man  D
Das hab ich nicht gesehen 
Ok Danke Danke Danke 
Aber eigentlich wollte ich ja mit der Adresse bzw. der Pointeradresse einen bestimmten bereich nach dieser Adresse absuchen.
Also ungefähr so wie pixelsearch wollte ich nun nur nicht nach Pixeln sondern nach der Adresse in einem bestimmten bereich suchen.
|
|
|
03/27/2013, 17:47
|
#6
|
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
|
Ja da oben redest du von Adressen und jetzt von Pointern.
Ist halt etwas schwerer.
Wenn du Skype hast kannst mich ja mal adden.
Muss jetzt weg noc hetwas erledigen.
|
|
|
03/30/2013, 14:06
|
#7
|
elite*gold: 0
Join Date: Mar 2010
Posts: 7
Received Thanks: 1
|
Ich hab dich bei Skype hinzugefügt aber du antwortest nicht...
Kann mir denn jetzt einer bei meinem Problem helfen ?
Ich versuche mein vorhaben nochmals besser darzustellen:
1. Ich lese eine Adresse mit Cheat Engine aus.
2. Ich möchte in einem bestimmen bereich z.B. in einem Spiel im Inventar nach dieser Adresse suchen. (Die Adresse ist zum Beispiel ein Item)
Meine Frage ist nun wie kann ich in meinem Inventar nach dieser nummer suchen bzw. nach diesem Item?
Ich hoffe ihr könnt mir helfen.
|
|
|
03/30/2013, 14:56
|
#8
|
elite*gold: 0
Join Date: Mar 2009
Posts: 2,317
Received Thanks: 1,255
|
ich würde so vorgehen:
-dein itemX im inventar an die erste stelle legen und nach "unknown value" suchen
-dein itemX mit einem anderen item vertauschen und nach "changed value" suchen
-X an erste stelle legen -> "changed value"
-inventar schließen, herrum laufen, im inventar andere items vertauschen und nach "Unchanged value" suchen
usw.
vllt. findest du am ende die adresse deines items, vllt aber auf die adresse vom item, die sich im slot1 befindet... musst halt testen 4byte/2byte ect.
ob es nun klappt oder nicht hängt auch vom spiel ab würd ich jetzt mal behaupten.
|
|
|
03/30/2013, 18:33
|
#9
|
elite*gold: 0
Join Date: Mar 2010
Posts: 7
Received Thanks: 1
|
Ja das habe ich ja schon gemacht die Adresse habe ich schon ...
Ich will nun nach der Adresse mit autoit im Inventar such damit autoit da drauf klickt ...
Bisher habe ich das mit pixelsearch gemacht aber das funktioniert ja nur auf meinem pc.
Ich möchte das ungefähr so haben wie bei einem Switch Bot, da bewegt sich ja auch keine Maus es geht alles automatisch.
|
|
|
03/31/2013, 00:31
|
#10
|
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
|
Quote:
Originally Posted by galexus
Ja das habe ich ja schon gemacht die Adresse habe ich schon ...
Ich will nun nach der Adresse mit autoit im Inventar such damit autoit da drauf klickt ...
Bisher habe ich das mit pixelsearch gemacht aber das funktioniert ja nur auf meinem pc.
Ich möchte das ungefähr so haben wie bei einem Switch Bot, da bewegt sich ja auch keine Maus es geht alles automatisch.
|
Du wirst keine Adresse für ein Item finden, die Items werden mit
hoher Wahrscheinlichkeit mit bestimmten ID's abgespeichert, die auf
bestimmten Inventarplätzen liegen.
Das wird dann in einer Funktion übergeben, welche du von
deinem Code aus, mit den entsprechenden Parametern,
selber aufrufen müsstest, wenn du keine Mausbewegung haben willst.
|
|
|
03/31/2013, 12:00
|
#11
|
elite*gold: 0
Join Date: Mar 2010
Posts: 7
Received Thanks: 1
|
Ah da kommen wir der Sache doch schon näher
Und wie kann ich in autoit auf diese IDs verweisen ?
Danke für eure Hilfe und frohe Ostern  ))
|
|
|
 |
Similar Threads
|
[VB]Write Memory bzw Read Memory
06/26/2010 - .NET Languages - 8 Replies
Hi
Ich hab das TuT von *Guidman* benütz um einen hack zu machen.
So aber nun hab ihc ein paar fragen könnte man memory teil kürzer machen und am besten wie kann man das selber machen weil ich will nihct immer C&P machen.
Und zu Read Memory kann man das auch machen das ein Label immer die Bestimmte Ahnzahl angiebt von dem Pointer?.(Wenn das Read Memory ist ?)
Bitte helf mir
Danke
|
Quick Memory Editor - Alternative Memory Hacking Software
11/21/2009 - Cabal Hacks, Bots, Cheats, Exploits & Macros - 11 Replies
This might be detected or not by GameGuard, I have not tested this on Official servers however it worked perfectly fine on other private servers.
http://imagenic.net/images/x0jxwzwpg2zxmkdtcf36.p ng
This is just an alternative memory editing tool.
Press thanks if this helps.
Remember, scan before using this.
Cause its 5.5MB.
|
Fragen Zur Memory!!!(Auslesen von Spawn/Memory)
12/31/2008 - Guild Wars - 3 Replies
hey leute,
ich wollte mal einen bot schreiben und nun bin ich ganz verwirrt.
könnte mir jmd bitte schritt für schritt erklären wie das mit Memory auslesen, benutzen und der Spawnpointer funktioniert.
Ich wär sehr dankbar wenn jmd kontakt mit mir aufnehmen würde...
und sobald der bot fertig ist bekommt der ihn natürlicherweise umsonst:D
ICQ: 481799773
oder hier im forum
|
Sample of memory search in PW for memory bot learner
02/25/2008 - Perfect World - 6 Replies
im learning how to make a memory bot as of know.. im expirience in pixel botin but the mob seacrh for it is quite slow.. ill be using au3 and the include nomadmemory.au3 from nomad in au3 forum. credits to him...
this is my sample of my memory script: it will be good for who wants to learn memory botin and has no available bot in their respective server
#include <Memory.au3>
Global $Pointer = d pointer in 4bytes in whch its store the modId when clicked just search in hex format in 4bytes...
|
All times are GMT +1. The time now is 20:25.
|
|