Multilevelpointer in Autoit verwenden

07/08/2013 02:32 Paraly#1
Heyho ich habe einen Multilevelpointer von dem Spiel Aion zwar in CE gefunden aber ich bekomm ihn einfach nicht in Autoit eingebunden, hab schon wie verrückt gegoogelt aber ich bekomms nicht hin :(
hoffe ihr könnt mir da weiterhelfen


So siehts in CE aus
[Only registered and activated users can see links. Click Here To Register...]



und so sieht mein bisheriger code aus
Code:
#RequireAdmin  
#include <Pointer.au3>  

HotKeySet("{F1}", "_Read")  

$PID = ProcessExists("aion.bin")  
If $PID > 0 Then  
    $Handle = _MemoryOpen($PID)  
    $Address = _MemoryModuleGetBaseAddress(ProcessExists("aion.bin"), "Game.dll")  
    $Address = "0x" & Hex($Address + Dec("00FB22BC"))  
    Dim $Offset[6] = [ 0, 0x5d4, 0, 0x248, 0x208, 0x264]  
Else  
    Exit  
EndIf  

While True  
    Sleep(10)  
WEnd  

Func _Read()  
    $Read = _MemoryPointerRead($Address, $Handle, $Offset, "float")  
    MsgBox(0, "", $Read[1])  
 EndFunc
07/08/2013 11:44 BladeTiger12#2
Code:
#RequireAdmin
#include <Pointer.au3>

HotKeySet("{F1}", "_Read")

Global $Address, $PID, $Handle
Dim $Offset[5] = [ 0x5d4, 0x0, 0x248, 0x208, 0x264]

$PID = ProcessExists("aion.bin")
If $PID > 0 Then
    $Handle = _MemoryOpen($PID)
    $Address = _MemoryModuleGetBaseAddress($PID, "Game.dll")
    $Address = $Address + 0x00FB22BC
Else
    Exit
EndIf

While True
    Sleep(10)
WEnd

Func _Read()
	$Read = _ReadPtr($Address, $Offset, $Handle, "float")
    MsgBox(0, "", $Read)
EndFunc

Func _ReadPtr($Ptr, $Offset, $MemOpen, $Type = "dword")
	If IsArray($Offset) Then
		For $i = 0 To UBound($Offset) -1
			$Ptr = _MemoryRead($Ptr, $MemOpen) + $Offset[$i]
		Next
		Return _MemoryRead($Ptr, $MemOpen, $Type)
	Else
		Return 0
	EndIf
EndFunc
Wenn es nicht geht sag bescheid.
Hier oder per Skype.
Skype steht unter meinem Profilbild.

Habs bei mir getestet.
Lvl 1 Char -> ergebnis 73.

Keine Ahnung was du da ausließt^^.

PS: Wenn du noch hilfe brauchst frag mich auch per Skype.
Helfe immer noch gerne :P.
07/08/2013 12:52 Paraly#3
Danke danke funktioniert perfekt :handsdown::handsdown:
07/08/2013 13:10 BladeTiger12#4
Versuch mal zu vermeiden:
1. In der Array ( Platz 0 ) eine 0 rein zu schreiben weil das ändert nichts.
2. warum so umständlich : "0x" & Hex($Module + (Dec("Addresse"))
3. Deklarier die Variablen lieber weiter oben.
4. Du musst nur einmal den PID deklarieren.

Mehr sehe ich auf die schnelle nicht.
07/08/2013 18:03 KDeluxe#5
Das Script von BladeTiger12 ist unbrauchbar. Schon allein aus dem Grund da das Spiel vor dem Script gestartet werden muss. Ist das nicht der Fall beendet es sich einfach.
Es fehlt jede Art von Fehlererkennung, es wird nur überprüft, ob das Spiel zu Beginn des Scripts läuft. Beendet man das Spiel vor dem Script stürzt es ab.
Es wird eine komplett sinnlose Funktion hinzugefügt (_ReadPtr()), welcher wiederum jegliche Art von Fehlererkennung fehlt.

Quote:
Originally Posted by BladeTiger12 View Post
1. In der Array ( Platz 0 ) eine 0 rein zu schreiben weil das ändert nichts.
Unabhängig davon, ob man jetzt "deine" Funktion verwendet oder nicht, diese Aussage ist einfach nur falsch. Ein 0er Offset hat wie jeder andere Wert eines Offsets einen Nutzen.

Quote:
Originally Posted by BladeTiger12 View Post
3. Deklarier die Variablen lieber weiter oben.
Das ist eigentlich egal, solange sie nicht global verwendet werden.



Dieses Script ist lange nicht perfekt, aber dennoch besser:
Code:
#RequireAdmin
#include <Pointer.au3>

HotKeySet("{F1}", "_Read")

Dim $szProcessName = "Aion.bin", $szModuleName = "Game.dll"
Dim $dwOffsets[6] = [0, 0x5D4, 0, 0x248, 0x208, 0x264]

While Sleep(10)
WEnd

Func _Read()
	$dwProcessId = ProcessExists($szProcessName)
	If $dwProcessId > 0 Then
		$hProcess = _MemoryOpen($ProcessId)
		If Not @error Then
			$dwModuleAddress = _MemoryModuleGetBaseAddress($dwProcessId, $szModuleName)
			If Not @error Then
				$dwBaseAddress = $dwModuleAddress + 0xFB22BC
				$rValue = _MemoryPointerRead($dwBaseAddress, $hProcess, $dwOffsets, "float")
				If Not @error Then MsgBox(64, "Info", "Adresse: " & $rValue[0] & @CRLF & "Wert: " & $rValue[1])
			EndIf
		EndIf
		_MemoryClose($hProcess)
	EndIf
EndFunc
07/08/2013 18:32 BladeTiger12#6
Ja ok, ich erwähnte nie das es brauchbar ist.
Und das mit der 0 In der Offset-Array finde ich trotz allem unnötig.
Und das man das Script noch verbessern kann ist schon klar.
Aber dafür das es unbrauchbar ist funktioniert es.

Und die Funktion _MemoryPointerRead habe ich schon immer gehasst :P.
07/08/2013 18:38 Paraly#7
Das Script von KDeluxe funktioniert nicht, es crasht direkt wenn ich F1 drücke

Edit: Habs jetzt mal ein bisschen verändert jetzt stürtzt es nicht mehr ab aber es gibt mir eine falsche Adresse raus

Code:
#RequireAdmin
#include <Pointer.au3>

HotKeySet("{F1}", "_Read")

Dim $szProcessName = "aion.bin", $szModuleName = "Game.dll"
Dim $dwOffsets[6] = [0, 0x5D4, 0, 0x248, 0x208, 0x264]

While Sleep(10)
WEnd

Func _Read()
	$dwProcessId = ProcessExists($szProcessName)
	If $dwProcessId > 0 Then
		$hProcess = _MemoryOpen($szProcessName)
		If Not @error Then
			$dwModuleAddress = _MemoryModuleGetBaseAddress($dwProcessId, $szModuleName)
			If Not @error Then
				$dwBaseAddress = $dwModuleAddress + 0xFB22BC
				$rValue = _MemoryPointerRead($dwBaseAddress, $hProcess, $dwOffsets, "float")
				If Not @error Then MsgBox(64, "Info", "Adresse: " & $rValue[0] & @CRLF & "Wert: " & $rValue[1])
			EndIf
		EndIf
		_MemoryClose($hProcess)
	EndIf
EndFunc
07/08/2013 18:43 BladeTiger12#8
Keine Ahnung warum, sieht relativ richtig aus.
Aber ich mag so eine Script-art auch nicht wirklich.
07/08/2013 23:37 KDeluxe#9
Fehlerbeachtung nicht zu mögen weil es mehr Code benötigt ist schlecht. Ich hab die ganzen UDFs gar nicht und kenne die Funktionsrückgaben nicht, evtl. gibt eine Funktionen kein @error zurück. Getestet habe ich das Script natürlich nicht.
Der Fehler dürfte aber _MemoryClose() sein, dieser Funktionsaufruf muss in den "If Not @error Then" Block.
Code:
#RequireAdmin
#include <Pointer.au3>

HotKeySet("{F1}", "_Read")

Dim $szProcessName = "Aion.bin", $szModuleName = "Game.dll"
Dim $dwOffsets[6] = [0, 0x5D4, 0, 0x248, 0x208, 0x264]

While Sleep(10)
WEnd

Func _Read()
	$dwProcessId = ProcessExists($szProcessName)
	If $dwProcessId > 0 Then
		$hProcess = _MemoryOpen($ProcessId)
		If Not @error Then
			$dwModuleAddress = _MemoryModuleGetBaseAddress($dwProcessId, $szModuleName)
			If Not @error Then
				$dwBaseAddress = $dwModuleAddress + 0xFB22BC
				$rValue = _MemoryPointerRead($dwBaseAddress, $hProcess, $dwOffsets, "float")
				If Not @error Then MsgBox(64, "Info", "Adresse: " & $rValue[0] & @CRLF & "Wert: " & $rValue[1])
			EndIf
			_MemoryClose($hProcess)
		EndIf
	EndIf
EndFunc
07/13/2013 19:33 Paraly#10
sorry das ich den thread nochmal auspack aber ich bräuchte eben kurz hilfe ich möchte an die gleiche value einen wert schreiben aber irgendwas funktioniert nicht so ganz bzw. das skript stürtzt nicht ab oder so nur es schreibt nicht.

Code:
#RequireAdmin
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Pointer.au3>


$Form1 = GUICreate("Aion FoV", 318, 131, 192, 124)
$Button1 = GUICtrlCreateButton("Write", 208, 32, 75, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Reset", 208, 72, 75, 25, $WS_GROUP)
$Label1 = guictrlcreatelabel("Wert zwischen 60-140",48,30)
$Input1 = GUICtrlCreateInput("60", 48, 48, 121, 21)
GUISetState(@SW_SHOW)


$open = _MemoryOpen(ProcessExists("aion.bin"))
Global $base = _MemoryModuleGetBaseAddress($open, "Game.dll")
Global $base = $base + 0x00FB22BC
Global $offis[5] = [ 0x5d4, 0x0, 0x248, 0x208, 0x264]


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
            
        Case $Button1 
        _MemoryPointerWrite($base,$open,$offis,GUICtrlRead($Input1))    
            
        Case $Button2
            _MemoryPointerWrite($base,$open,$offis,"60")
    EndSwitch
WEnd
07/13/2013 20:56 Asuramaru#11
Denke mal im Offset fehlt die 0 am Anfang.

Außerdem solltest du angeben welcher Datentyp benutzt wird.
Denn standardmäßig wird "dword" und nicht "float" von der UDF benutzt.
07/13/2013 21:07 Paraly#12
hab das mit float schonmal angepasst und auch die 0 bei den offsets hinzugefügt aber es funktioniert immernoch nicht, in dem ersten skript von bladetiger12 hat er ja auch keine 0 am anfang deklariert bei den offsets und trotzdem funktioniert sein skript :confused:


so sieht der code jetzt aus
Code:
#RequireAdmin
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Pointer.au3>


$Form1 = GUICreate("Aion FoV", 318, 131, 192, 124)
$Button1 = GUICtrlCreateButton("Write", 208, 32, 75, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Reset", 208, 72, 75, 25, $WS_GROUP)
$Label1 = guictrlcreatelabel("Wert zwischen 60-140",48,30)
$Input1 = GUICtrlCreateInput("60", 48, 48, 121, 21)
GUISetState(@SW_SHOW)

global $PID = ProcessExists("aion.bin")
   If $PID > 0 Then
	  global $open = _MemoryOpen($PID)
	  Global $base = _MemoryModuleGetBaseAddress($PID, "Game.dll")
	  Global $base = $base + 0x00FB22BC
	  Global $offis[5] = [ 0x5d4, 0x0, 0x248, 0x208, 0x264]
   Else
	  msgbox(0,"ERROR","Aion nicht gefunden")
	  exit
   endif

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
            
        Case $Button1 
        _MemoryPointerWrite($base,$open,$offis,GUICtrlRead($Input1),"float")    
            
        Case $Button2
            _MemoryPointerWrite($base,$open,$offis,"60","float")
    EndSwitch
WEnd
kann es daran liegen das ich ein 64-bit system habe, hab mal irgendwo gelesen das man dann die pointer.au3 anpassen müsse?

Wow endlich nach langem ausprobieren und versuchen jeden einzelnen schritt nochmal genau zu analysieren von bladetiger12 skript hab ich jetzt endlich alles verstanden :D

Code:
#requireadmin

#include <Pointer.au3>
$PID = ProcessExists("aion.bin") 
$MemOpen = _MemoryOpen($PID) 

Dim $Offset[5] = [ 0x5d4, 0x0, 0x248, 0x208, 0x264]

$StaticOffset = Dec("00FB22BC")
$BaseAddr = _MemoryModuleGetBaseAddress($PID, "Game.dll")  
$Addr = "0x" & Hex($BaseAddr + 0x00FB22BC)  



$var = 0
do
$Addr = _MemoryRead($Addr, $MemOpen) + $Offset[$var]
$var = $var + 1
until $var = UBound($Offset)



_MemoryWrite($Addr, $MemOpen,"140", "float")
Exit
somit hat sich alles geklärt :rolleyes: