Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > AutoIt
You last visited: Today at 16:29

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[AutoIt]NomadMemory - PointerRead/Write Hilfe

Discussion on [AutoIt]NomadMemory - PointerRead/Write Hilfe within the AutoIt forum part of the Coders Den category.

Reply
 
Old   #1
 
TheKingTurko's Avatar
 
elite*gold: 159
Join Date: Jan 2012
Posts: 526
Received Thanks: 85
Question [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
TheKingTurko is offline  
Old 02/07/2016, 17:12   #2
 
alpines's Avatar
 
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.
alpines is offline  
Old 02/07/2016, 17:37   #3
 
TheKingTurko's Avatar
 
elite*gold: 159
Join Date: Jan 2012
Posts: 526
Received Thanks: 85
Quote:
Originally Posted by alpines View Post
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?
TheKingTurko is offline  
Old 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
BladeTiger12 is offline  
Old 03/06/2016, 11:54   #5
 
TheKingTurko's Avatar
 
elite*gold: 159
Join Date: Jan 2012
Posts: 526
Received Thanks: 85
Habe es so hinbekommen mit 3 Offsets:

TheKingTurko is offline  
Reply

Tags
autoit, cheatengine, memoryreadwrite, nomadmemory


Similar Threads 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.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.