|
You last visited: Today at 16:29
Advertisement
[AutoIt]NomadMemory - PointerRead/Write Hilfe
Discussion on [AutoIt]NomadMemory - PointerRead/Write Hilfe within the AutoIt forum part of the Coders Den category.
02/07/2016, 15:05
|
#1
|
elite*gold: 159
Join Date: Jan 2012
Posts: 526
Received Thanks: 85
|
[AutoIt]NomadMemory - PointerRead/Write Hilfe
Hellow leidenschaftliche Coder
Vor kurzem habe ich angefangen, zu versuchen ein Hack(später dann ein Trainer) für Age Of Empires II zu schreiben. Ich habe die Pointer der Ressourcen gefunden und sie sind statisch. Nur habe ich allerdings Probleme dies in ein Programm zu verwickeln.
Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
#RequireAdmin
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("AoE 2 - Hack", 253, 36, 200, 122)
$Button1 = GUICtrlCreateButton("Holz", 160, 8, 25, 17, $WS_GROUP)
GUICtrlSetFont(-1, 8, 400, 0, "Palatino Linotype")
$Button2 = GUICtrlCreateButton("Off", 192, 8, 25, 17, $WS_GROUP)
GUICtrlSetFont(-1, 8, 400, 0, "Palatino Linotype")
$Input1 = GUICtrlCreateInput("", 80, 8, 73, 19)
GUICtrlSetFont(-1, 6, 400, 0, "Palatino Linotype")
$Label1 = GUICtrlCreateLabel("Holz", 8, 8, 58, 20)
GUICtrlSetFont(-1, 8, 400, 0, "Palatino Linotype")
$Graphic1 = GUICtrlCreateGraphic(224, 8, 25, 17)
GUICtrlSetColor(-1, 0x000000)
GUICtrlSetBkColor(-1, 0xFF0000)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$GamePid = ProcessExists("AoK HD.exE")
If($GamePid) Then
$GameHandle = _MemoryOpen($GamePid)
Else
MsgBox(0,"Error","Prozess existiert nicht, oder ist noch nicht offen")
Exit
EndIf
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_MemoryClose($GameHandle)
Exit
Case $Button1
_GiveHolz($GameHandle,GUICtrlRead($Input1))
Case $Button2
_ZeigAn($GameHandle)
EndSwitch
WEnd
Func _Zeig($GameHandle)
$BaseAdresse = 0x527378
Dim $Offset[3]
$Offset[0] = 12
$Offset[1] = 168
$Offset[2] = 4
MsgBox(0,"",$BaseAdresse)
;~ $Werto = _MemoryGetBaseAddress($GameHandle,1)
;~ MsgBox(0,"BaseAdress",$Werto)
;~ $Wert = _MemoryRead(0x15E8FB40, $GameHandle)
;~ MsgBox(0,"Wert",Hex($Wert))
;~ MsgBox(0,"BaseAdress",$BaseAdresse)
;~ $BaseAdresse = $Wert + $Offset[$i]
;~ MsgBox(0,"BaseAdress",$BaseAdresse)
;~ MsgBox(0,"",$BaseAdresse)
EndFunc
#cs
Hier habe ich versucht auch ohne PointerRead/Write zu machen. Auch schon in einer For-Schleife. Einfach die Offsets selber addieren
und den Wert der Adresse auslesen und so weiter..
#ce
Func _ZeigAn($GameHandle)
$BaseAdresse = 0x00527378
$BaseAdresse_New = _MemoryRead($BaseAdresse, $GameHandle)
Dim $Offset[3]
$Offset[0] = 12
$Offset[1] = 168
$Offset[2] = 4
for $i=0 To UBound($Offset) Step 1
$BaseAdresse = $BaseAdresse_New + $Offset[$i]
if($i==3) Then ExitLoop(1)
$BaseAdresse_New = _MemoryRead($BaseAdresse, $GameHandle)
Next
MsgBox(0,"Holz","Anzahl: '"&_MemoryRead($BaseAdresse, $GameHandle,"FLOAT" )&"'")
;~ Dim $back[2]
;~ $back = _MemoryPointerRead($BaseAdresse, $GameHandle, $Offset, "FLOAT")
;~ MsgBox(0,"Holz",@error)
;~ MsgBox(0,"Holz","Anzahl: '"&$back[0]&"' "&$back[1])
EndFunc
Func _GiveHolz($GameHandle,$Value)
$BaseAdresse = 0x123296A4
Dim $Holz[4]
$Holz[0] = 0
$Holz[1] = 0x334
$Holz[2] = 0xA8
$Holz[3] = 0x2C
_MemoryWrite($BaseAdresse, $GameHandle, $Value, "FLOAT") ;Funktioniert aber nur mit einer Dynamischen Adresse
;_MemoryPointerWrite($BaseAdresse, $GameHandle,$Holz, $Value, "FLOAT") Funktioniert nicht, zwar gibt es kein Error-Code aber der Wert wird nicht eingetragen
MsgBox(0,"",@error)
GUICtrlSetBkColor($Graphic1, 65280)
EndFunc
Func _Exit()
Exit
EndFunc
Hier ist der Pointer mit den Offsets in Cheatengine
Für mich zum verstehen, wird dies so "gerechnet" das als erstes der Wert der Adresse "AoK HD.exe"+00527378 ausgelesen wird und in dem Fall wäre dies 12A1E00 dies wird dann + C gerechnet und dies wiederum ist eine Adresse, der den Wert 12532980 enthält usw.. ?
Habe auch schon mit C# versucht, mit schon bestehenden Klassen von anderen, doch ich denke da AutoIt noch recht einfach zu verstehen ist und ich schon etwas länger damit rumprobiert habe, ist es für mich auch einfacher.
freue mich auf jede Hilfe
|
|
|
02/07/2016, 17:12
|
#2
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Du hast bei einem Pointerarray vergessen die 0 als Startindexwert zu haben.
|
|
|
02/07/2016, 17:37
|
#3
|
elite*gold: 159
Join Date: Jan 2012
Posts: 526
Received Thanks: 85
|
Quote:
Originally Posted by alpines
Du hast bei einem Pointerarray vergessen die 0 als Startindexwert zu haben.
|
Ja, stimmt. Allerdings habe ich das nur jetzt rausgenommen für die Schleife, d.h habe es vorher noch mit 0 probiert.
Ist es so, das in Cheatengine so aufgezeigt wird? Also die Addresse wird ausgelesen danach ist -> der Wert hier und hier wird wiederum der Wert zu einer Adresse die auf einen anderen Wert zeigt. Vielleicht kann ich es ohne Pointerwrite versuchen?
|
|
|
02/07/2016, 20:02
|
#4
|
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
|
Probier das mal aus
(_MemoryModuleGetBaseAddress -> $PID und $Modul. Schau mal in Cheat Engine was vor dem + 0x527378 steht und korrigier das in Zeile 70 hinten wo "AoK HD" steht wenn es falsch ist)
Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
#RequireAdmin
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("AoE 2 - Hack", 253, 36, 200, 122)
$Button1 = GUICtrlCreateButton("Holz", 160, 8, 25, 17, $WS_GROUP)
GUICtrlSetFont(-1, 8, 400, 0, "Palatino Linotype")
$Button2 = GUICtrlCreateButton("Off", 192, 8, 25, 17, $WS_GROUP)
GUICtrlSetFont(-1, 8, 400, 0, "Palatino Linotype")
$Input1 = GUICtrlCreateInput("", 80, 8, 73, 19)
GUICtrlSetFont(-1, 6, 400, 0, "Palatino Linotype")
$Label1 = GUICtrlCreateLabel("Holz", 8, 8, 58, 20)
GUICtrlSetFont(-1, 8, 400, 0, "Palatino Linotype")
$Graphic1 = GUICtrlCreateGraphic(224, 8, 25, 17)
GUICtrlSetColor(-1, 0x000000)
GUICtrlSetBkColor(-1, 0xFF0000)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$GamePid = ProcessExists("AoK HD.exE")
If($GamePid) Then
$GameHandle = _MemoryOpen($GamePid)
Else
MsgBox(0,"Error","Prozess existiert nicht, oder ist noch nicht offen")
Exit
EndIf
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_MemoryClose($GameHandle)
Exit
Case $Button1
_GiveHolz($GameHandle,GUICtrlRead($Input1))
Case $Button2
_ZeigAn($GameHandle)
EndSwitch
WEnd
Func _Zeig($GameHandle)
$BaseAdresse = 0x527378
Dim $Offset[3]
$Offset[0] = 12
$Offset[1] = 168
$Offset[2] = 4
MsgBox(0,"",$BaseAdresse)
;~ $Werto = _MemoryGetBaseAddress($GameHandle,1)
;~ MsgBox(0,"BaseAdress",$Werto)
;~ $Wert = _MemoryRead(0x15E8FB40, $GameHandle)
;~ MsgBox(0,"Wert",Hex($Wert))
;~ MsgBox(0,"BaseAdress",$BaseAdresse)
;~ $BaseAdresse = $Wert + $Offset[$i]
;~ MsgBox(0,"BaseAdress",$BaseAdresse)
;~ MsgBox(0,"",$BaseAdresse)
EndFunc
#cs
Hier habe ich versucht auch ohne PointerRead/Write zu machen. Auch schon in einer For-Schleife. Einfach die Offsets selber addieren
und den Wert der Adresse auslesen und so weiter..
#ce
Func _ZeigAn($GameHandle)
$BaseAdresse = 0x00527378 + _MemoryModuleGetBaseAddress($GamePid, "AoK HD")
$BaseAdresse_New = _MemoryRead($BaseAdresse, $GameHandle)
Dim $Offset[3]
$Offset[0] = 12
$Offset[1] = 168
$Offset[2] = 4
for $i=0 To UBound($Offset) - 1
$BaseAdresse = $BaseAdresse_New + $Offset[$i]
$BaseAdresse_New = _MemoryRead($BaseAdresse, $GameHandle)
Next
MsgBox(0,"Holz","Anzahl: '"&$BaseAdresse_New&"'"& @CRLF & "Anzahl: '"&_MemoryRead($BaseAdresse, $GameHandle,"FLOAT" )&"'")
;~ Dim $back[2]
;~ $back = _MemoryPointerRead($BaseAdresse, $GameHandle, $Offset, "FLOAT")
;~ MsgBox(0,"Holz",@error)
;~ MsgBox(0,"Holz","Anzahl: '"&$back[0]&"' "&$back[1])
EndFunc
Func _GiveHolz($GameHandle,$Value)
$BaseAdresse = 0x123296A4
Dim $Holz[4]
$Holz[0] = 0
$Holz[1] = 0x334
$Holz[2] = 0xA8
$Holz[3] = 0x2C
_MemoryWrite($BaseAdresse, $GameHandle, $Value, "FLOAT") ;Funktioniert aber nur mit einer Dynamischen Adresse
;_MemoryPointerWrite($BaseAdresse, $GameHandle,$Holz, $Value, "FLOAT") Funktioniert nicht, zwar gibt es kein Error-Code aber der Wert wird nicht eingetragen
MsgBox(0,"",@error)
GUICtrlSetBkColor($Graphic1, 65280)
EndFunc
Func _Exit()
Exit
EndFunc
Func _MemoryModuleGetBaseAddress($iPID, $sModule)
If Not ProcessExists($iPID) Then Return SetError(1, 0, 0)
If Not IsString($sModule) Then Return SetError(2, 0, 0)
Local $PSAPI = DllOpen("psapi.dll")
;Get Process Handle
Local $hProcess
Local $PERMISSION = BitOR(0x0002, 0x0400, 0x0008, 0x0010, 0x0020) ; CREATE_THREAD, QUERY_INFORMATION, VM_OPERATION, VM_READ, VM_WRITE
If $iPID > 0 Then
Local $hProcess = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", $PERMISSION, "int", 0, "dword", $iPID)
If $hProcess[0] Then
$hProcess = $hProcess[0]
EndIf
EndIf
;EnumProcessModules
Local $Modules = DllStructCreate("ptr[1024]")
Local $aCall = DllCall($PSAPI, "int", "EnumProcessModules", "ptr", $hProcess, "ptr", DllStructGetPtr($Modules), "dword", DllStructGetSize($Modules), "dword*", 0)
If $aCall[4] > 0 Then
Local $iModnum = $aCall[4] / 4
Local $aTemp
For $i = 1 To $iModnum
$aTemp = DllCall($PSAPI, "dword", "GetModuleBaseNameW", "ptr", $hProcess, "ptr", Ptr(DllStructGetData($Modules, 1, $i)), "wstr", "", "dword", 260)
If $aTemp[3] = $sModule Then
DllClose($PSAPI)
Return Ptr(DllStructGetData($Modules, 1, $i))
EndIf
Next
EndIf
DllClose($PSAPI)
Return SetError(-1, 0, 0)
EndFunc
|
|
|
03/06/2016, 11:54
|
#5
|
elite*gold: 159
Join Date: Jan 2012
Posts: 526
Received Thanks: 85
|
Habe es so hinbekommen mit 3 Offsets:
Func _PointerRead($Pointer, $offset1, $offset2, $offset3)
Global $hOpen, $sRead
$hOpen = _MemoryOpen(ProcessExists("AoK HD.exe"))
$fRead = _MemoryRead($Pointer,$hOpen,'dword') + $offset1 ;114CF1E0+C
$fRead_2 = _MemoryRead($fRead, $hOpen, 'dword') ;0x1156D318
$gRead = _MemoryRead($fRead_2 + $offset2, $hOpen, 'dword') ;0xFE1D2B0
$hRead = _MemoryRead($gRead+ $offset3, $hOpen, 'float') ; RESULT
_MemoryClose($hOpen)
return $hRead
EndFunc
Func _PointerWrite($Pointer, $offset1, $offset2, $offset3, $value)
Global $hOpen, $sRead
$hOpen = _MemoryOpen(ProcessExists("AoK HD.exe"))
$fRead = _MemoryRead($Pointer,$hOpen,'dword') + $offset1 ;114CF1E0+C
$fRead_2 = _MemoryRead($fRead, $hOpen, 'dword') ;0x1156D318
$gRead = _MemoryRead($fRead_2 + $offset2, $hOpen, 'dword') ;0xFE1D2B0
$hRead = _MemoryRead($gRead+ $offset3,$hOpen, 'float') ; RESULT
_MemoryWrite($gRead + $offset3, $hOpen, $value, 'float')
_MemoryClose($hOpen)
return $hRead
EndFunc
|
|
|
Similar Threads
|
Autoit nomadmemory.au3
03/25/2014 - AutoIt - 13 Replies
Moin,
Ich möchte mal in Autoit was neues machen & habe mir mal die UDF Nomadmemory angeschaut, finde ich echt super :)
Mein Test spiel ist Solitair.
Mein bisheriges Spiel sied so aus:
#RequireAdmin
#include <NomadMemory.au3>
|
autoit nomadmemory.au3 befehle
03/21/2014 - AutoIt - 5 Replies
heyho,
ich wollte mich mal ein wenig mit dem memory auslesen / verändern von spielen via autoit auseinander setzen, stoße jetzt aber auf folgendes problem.
gibt es irgendwo eine auflistung der ganzen memorywrite / read etc. befehle und deren syntax, funktionen?
habe dementsprechend leider nichts vollständiges gefunden.
gruß
|
All times are GMT +1. The time now is 16:29.
|
|