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($read3, 8)
      ;
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