Pointer und Offsets?

08/04/2013 14:44 blackout617#1
Hallo ich habe ein project für ein spiel aber ich kenne micht nicht mit offsets aus.
Wie kan ich das jetzt benutzen ?
Meiner example code:
Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
#include <ProgressConstants.au3>

$ActualHP = 0x007E6938 
$ofset1=0xAC 
$ofset2=0x48

Global $Open = _MemoryOpen(ProcessExists("NostaleX.dat"))

$valueAd=_MemoryRead($ActualHP+$ofset1, $Open)
$curValue=_MemoryRead($valueAd+$ofset2, $Open)

Msgbox(64,"Actual HP",$curValue)
aber bei der msgbox komt "0" und nicht actual hp warum ?
die adressen & offsets die ich habe
MAX HP = 007E6938 Offset1:AC Offset2:48
CURRENT HP = 007E6938 Offset1:AC Offset2:4C
08/04/2013 16:06 Croco™#2
Für Pointer gibt es die Funktion _MemoryPointerRead.
Dort kannst du die Offsets als Array übergeben.
Das kannst du dir auch einmal durchlesen:
[Only registered and activated users can see links. Click Here To Register...]
08/04/2013 22:11 KDeluxe#3
Du addierst auf die Adresse das Offset. Das ist falsch. Du musst das Offset auf den ausgelesenen Wert addieren. Oder einfach Funktionen verwenden die Pointer "unterstützen".

[Only registered and activated users can see links. Click Here To Register...]
08/06/2013 22:40 blackout617#4
Croco das geht glaub auch nicht komt wieder "0",
KDeluxe funkt es nur bei 64bit weil ich habe 32bit windows XP , und ich kriege "Can't read memory! @error:15"
08/10/2013 17:09 blackout617#5
Hier jetzt habe ich das wersucht aber wieder kein erfolg was mache ich falsch ?
Code:
#include <Pointer.au3>
$PID = ProcessExists("MultiClient.exe")
$MemOpen = _MemoryOpen($PID)

Global $Offset[3]
$Offset[0] = 0 
$Offset[1] = Dec("48") 
$Offset[2] = Dec("AC")
$StaticOffset = Dec("003E6948") 

$BaseAddr = _MemoryGetBaseAddress($MemOpen, 1) 
$Addr = "0x" & Hex($baseADDR + $StaticOffset) 

$Value = _MemoryPointerRead($Addr, $MemOpen, $Offset)

while 1
Tooltip ($Value[1])
WEnd
Hier die offset und base oder sowas ein photo was mache ich falsch?

[Only registered and activated users can see links. Click Here To Register...]
08/10/2013 17:59 KDeluxe#6
Quote:
Originally Posted by blackout617 View Post
Croco das geht glaub auch nicht komt wieder "0",
KDeluxe funkt es nur bei 64bit weil ich habe 32bit windows XP , und ich kriege "Can't read memory! @error:15"
Nafensterlich funktioniert meine UDF auch mit 32 Bit Betriebssystemen. @error 15 sagt aus, dass die finale Adresse nicht gelesen werden konnte. Ursache dafür ist so gut wie immer die Verwendung von falschen Offsets. Evtl. sind sie einfach in der falschen Reihenfolge.

Quote:
Originally Posted by blackout617 View Post
Hier jetzt habe ich das wersucht aber wieder kein erfolg was mache ich falsch ?
Code:
#include <Pointer.au3>
$PID = ProcessExists("MultiClient.exe")
$MemOpen = _MemoryOpen($PID)

Global $Offset[3]
$Offset[0] = 0 
$Offset[1] = Dec("48") 
$Offset[2] = Dec("AC")
$StaticOffset = Dec("003E6948") 

$BaseAddr = _MemoryGetBaseAddress($MemOpen, 1) 
$Addr = "0x" & Hex($baseADDR + $StaticOffset) 

$Value = _MemoryPointerRead($Addr, $MemOpen, $Offset)

while 1
Tooltip ($Value[1])
WEnd
Hier die offset und base oder sowas ein photo was mache ich falsch?

[Only registered and activated users can see links. Click Here To Register...]
Und siehe da... Ich hatte recht, du verwendest "falsche" Offsets. Genau genommen ist die Reihenfolge falsch.

So sollte es funktionieren:
08/10/2013 18:56 blackout617#7
Danke jetzt krieg ich aber: Can't get ModuleBaseAdress! @error:21,@extend:0
08/10/2013 20:06 KDeluxe#8
Das kann mehrere Ursachen haben, ich möchte aber erst nicht darauf eingehen. "; not recommended" steht nicht ohne Grund in meinem Beispiel. Fast immer ist es eine unnötige Ressourcenverschwendung die zusätzliches Fehlerpotenzial entwickelt.

Probiere folgendes aus:
08/10/2013 20:09 blackout617#9
Quote:
Originally Posted by KDeluxe View Post
Das kann mehrere Ursachen haben, ich möchte aber erst nicht darauf eingehen. "; not recommended" steht nicht ohne Grund in meinem Beispiel. Fast immer ist es eine unnötige Ressourcenverschwendung die zusätzliches Fehlerpotenzial entwickelt.

Probiere folgendes aus:
@error 15

hatte es woher auch schon probiert :
$lpBaseAddress = 0x0356DC90
und
$lpBaseAddress = "0356DC90"
08/10/2013 20:21 KDeluxe#10
Die Angabe als String kann nicht funktionieren. Den String müsstest du dann schon der Dec() Funktion übergeben. Da du den Wert aber direkt in Hexadezimalschreibweise angeben kannst rate ich dir davon ab.
Überprüfe mal, ob diese Adresse immer die richtige BaseAddress ist sich nie ändert. Interessant wäre in diesem Zusammenhang auch, ob folgendes funktioniert:
Wenn dieses Script funktioniert muss ich mir meine UDF noch mal anschauen, vielleicht habe ich tatsächlich eine fehlerhafte hochgeladen, wobei ich aktuell nicht davon ausgehe.
08/10/2013 20:48 blackout617#11
Ich werde noch verrück es funk nicht :(( was für eine adressse komt bei msgbox (msgbox ist ja das gleiche ich habe consolewrite genutzt für copy/paste ergebnis)
ConsoleWrite("Address: " & $lpMemoryData[0] & @CRLF & "Value: " & $lpMemoryData[1])

Code:
Address: 0x000000000384C7A8
Value: 0
08/10/2013 21:06 SpieleHacksInfo#12
Ist die Adresse 384C7A8 denn richtig?
08/10/2013 21:16 blackout617#13
Nein,Das ist ja das ergebnis :/
08/10/2013 21:41 BladeTiger12#14
Lol^^, wieso ist dein ergebnis ein Hex?

Hast du es umgewandelt?
08/10/2013 21:48 blackout617#15
Glaub nein also ich habe das hier benutzt und das ergebnis habe ich ja geschrieben :)
Code:
#AutoIt3Wrapper_UseX64=n
#include <Pointer.au3>

$szProcessName = "MultiClient.exe"
$dwProcessId = ProcessExists($szProcessName)
If $dwProcessId == 0 Then
    MsgBox(48, "Error", "Process doesn't exists!")
Else
    $phHandles = _MemoryOpen($dwProcessId)
    If @error Then
        MsgBox(48, "Error", "Can't open " & $szProcessName & "! @error: " & @error)
    Else
        $lpBaseAddress = 0x0356DC90
        Dim $pOffsets[3] = [0, 0xAC, 0x48]
        $lpMemoryData = _MemoryPointerRead($lpBaseAddress, $phHandles, $pOffsets, 'DWORD')
        If @error Then
            MsgBox(48, "Error", "Can't read memory! @error: " & @error & ", @extended: " & @extended)
		 Else
			ConsoleWrite("Address: " & $lpMemoryData[0] & @CRLF & "Value: " & $lpMemoryData[1])
            MsgBox(64, "Info", "Address: " & $lpMemoryData[0] & @CRLF & "Value: " & $lpMemoryData[1])
        EndIf
        _MemoryClose($phHandles)
    EndIf
EndIf
Glaub nein also ich habe das hier benutzt und das ergebnis habe ich ja geschrieben :)
Code:
#AutoIt3Wrapper_UseX64=n
#include <Pointer.au3>

$szProcessName = "MultiClient.exe"
$dwProcessId = ProcessExists($szProcessName)
If $dwProcessId == 0 Then
    MsgBox(48, "Error", "Process doesn't exists!")
Else
    $phHandles = _MemoryOpen($dwProcessId)
    If @error Then
        MsgBox(48, "Error", "Can't open " & $szProcessName & "! @error: " & @error)
    Else
        $lpBaseAddress = 0x0356DC90
        Dim $pOffsets[3] = [0, 0xAC, 0x48]
        $lpMemoryData = _MemoryPointerRead($lpBaseAddress, $phHandles, $pOffsets, 'DWORD')
        If @error Then
            MsgBox(48, "Error", "Can't read memory! @error: " & @error & ", @extended: " & @extended)
		 Else
			ConsoleWrite("Address: " & $lpMemoryData[0] & @CRLF & "Value: " & $lpMemoryData[1])
            MsgBox(64, "Info", "Address: " & $lpMemoryData[0] & @CRLF & "Value: " & $lpMemoryData[1])
        EndIf
        _MemoryClose($phHandles)
    EndIf
EndIf