was mach ich falsch ? pointer offset

04/13/2012 02:06 Mr.Netwolf#1
ich weis eigentlich garnix über di everwendung von pointern und offsets

wer mir da bisschen weiterhelfen möchte dem würd ich jetz schon sehr danken.

ich versuch einfach nur die values für target HP raus zu ziehen .
aber irgendwas mach ich falsch .
Code:
#include <NomadMemory.au3>
SetPrivilege("SeDebugPrivilege", 1)
#RequireAdmin
$PID = ProcessExists("aion.bin")

If $PID Then
     MsgBox(0, "kieron is gay", $PID)
   
   $open=_MemoryOpen($PID)
   MsgBox(0, "kieron is gay", $open[0])
   If $open[0] Then
	  $baseADDR = _MemoryModuleGetBaseAddress($PID, "Game.dll")

$TargetBase = 0x7AEA60
$TargetOffset = 0x1D4
$TargetState = 0x298 ;(1 ==> Attacking, 0 ==> Not Attacking, 7 == Dead)
$TargetLevel = 0x36
$TargetName = 0x3A
$TargetHP = 0x10E0
$TargetHPPercent = 0x38
$TargetMaxHP = 0x10DC
;TargetPosition (Just Game.dll+7ADA60+OFFSET)
$TargetPositionX = 0x34
$TargetPositionY = 0x38
$TargetPositionZ = 0x3C


$finalADDR = Hex($baseADDR + $TargetBase + $TargetHP)
$MemTest = _MemoryRead($finalADDR,$PID)
  MsgBox(0,"Value", $MemTest )
_MemoryClose($PID) 

EndIf
EndIf
die offsets sollten alle aktuel sein.
04/13/2012 06:07 KDeluxe#2
_MemoryRead() erwartet als Parameter das von _MemoryOpen() zurückgegebenes Array und nicht die Prozess ID. In "deinem" Script wäre es $open.

PHP Code:
#RequireAdmin
#include <NomadMemory.au3>

SetPrivilege("SeDebugPrivilege"1)
$ProcessId ProcessExists("aion.bin")
If 
$ProcessId 0 Then
    $Handle 
_MemoryOpen($ProcessId)
    If 
Not @error Then
        $BaseAddress 
_MemoryModuleGetBaseAddress($ProcessId"Game.dll")
        If 
Not @error Then
            $TargetBase 
0x7AEA60
            $TargetHP     
0x10E0

            $Value 
_MemoryRead($BaseAddress $TargetBase $TargetHP$Handle)
            
MsgBox(0"Value"$Value)
        EndIf
        
_MemoryClose($Handle)
    EndIf
EndIf 
Da ich mich mit Aion nicht auskenne kann ich nicht sagen, ob das so auch stimmt.
04/13/2012 16:06 Mr.Netwolf#3
danke habe die ganze nacht damit verbracht mich mit memory assembler und der interaktion zwischen pointer und offset schlauer zu machen.

das problem lag zum einen darin. das dazwischen nochn Offset gefehlt hat 0x1D4 und ich direkt nach der addresse gesucht hab. das geht natürlich nicht so.

da ja ich ja die addresse in der adresse suchen muss. jetzt sieht das ganze so aus und funktioniert soweit einwandfrei ^__^

nur ein problem gibs noch. beim umwandeln in Hex kommen komische werte wie 0x00000000xxxxxxxx raus. die ich momentan dann einfach erstmal mit stringtrimleft() umwandle falls ich die werte direkt als Hex brauch. Angeblich soll das daran liegen das die werte die begrenzung von autoit überschreiten....

PHP Code:
#include <NomadMemory.au3>
SetPrivilege("SeDebugPrivilege"1)
#RequireAdmin
Local $prozessname = ("aion.bin")
$PID ProcessExists($prozessname)
    If 
$PID 0 Then
       $pointerbase 
0x7AEA60
        $Handle 
_MemoryOpen($PID)
        
$Address _MemoryModuleGetBaseAddress("" $PID """" "Game.Dll" "") + $pointerbase 
          MsgBox
(0,"Pointer"$Address)
     EndIf
    
$read1 _MemoryRead($Address$Handle)
      
MsgBox(0,"Pointervalue"$read1)
    
$read2 _MemoryRead($read1 0x1D4$Handle)
      
MsgBox(0,"Value"$read2)
       
MsgBox(0,"Value"$read2 0x10E0)
       
       ; 
temporary fix
       
da values zu groß sind müssen hex values getrimt werden befor sie direkt verwended können...
       ;
$read3 "0x" StringTrimLeft($read38)
      ;
MsgBox(0,"Value"$read3)
       
       
      
$finalread _MemoryRead($read2 0x10E0$Handle)
      
MsgBox(0,"Value"$read2 0x10E0)
      
MsgBox(0,"Value"$finalread)
    
_MemoryClose($PID
04/13/2012 21:52 KDeluxe#4
Die verwendeten " in _MemoryModuleGetBaseAddress() kannst du dir sparen. Bei _MemoryClose() übergibt man außerdem auch das zu schließende Handle. Da du die 64 Bit Version von AutoIt benutzt werden hexadezimale Strings mit 16 Zeichen angezeigt. Allerdings gibt keine Funktion einen Hex-String zurück gibt.

Code:
#AutoIt3Wrapper_usex64=n

#RequireAdmin
#include <NomadMemory.au3>
SetPrivilege("SeDebugPrivilege", 1)

$ProcessId = ProcessExists("aion.bin")
If $ProcessId > 0 Then
	$Handle = _MemoryOpen($ProcessId)
	If Not @error Then
		$Address = _MemoryModuleGetBaseAddress($ProcessId, "Game.Dll")
		If Not @error Then
			$Baseaddress = $Address + 0x7AEA60
			$read1 		 = _MemoryRead($Baseaddress, $Handle)
			$read2 		 = _MemoryRead($read1 + 0x1D4, $Handle)
			$Value 	 	 = _MemoryRead($read2 + 0x10E0, $Handle)

			;Dim $Offset[3] = [0, 0x1D4, 0x10E0]
			;$Value = _MemoryPointerRead($Baseaddress, $Handle, $Offset)

			MsgBox(0, "", 	"Base: " & Hex($Baseaddress) & @CR & "Read1: " & Hex($read1) & @CR & _
							"Read2: " & Hex($read2) & @CR & "Value: " & $Value)
		EndIf
		_MemoryClose($Handle)
	EndIf
EndIf