[AutoIt]NomadMemory - PointerRead/Write Hilfe

02/07/2016 15:05 TheKingTurko#1
Hellow leidenschaftliche Coder:mofo:

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

[Only registered and activated users can see links. Click Here To Register...]

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 alpines#2
Du hast bei einem Pointerarray vergessen die 0 als Startindexwert zu haben.
02/07/2016 17:37 TheKingTurko#3
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?
02/07/2016 20:02 BladeTiger12#4
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 TheKingTurko#5
Habe es so hinbekommen mit 3 Offsets: