Nomad, Pointer zu lang?

01/29/2017 10:25 Stylerr#1
Hallo,

wenn ich BaseAddress + StaticOffset rechne, kommt die richtige Variabel raus. Jedoch hat sie dann 9 Stellen, wie kann das NomandMemory auslesen?
Gibt es vllt einen Umweg?

Example: Base: 13F2C0000
SOff: 023BA810
= 014167A810

; Function: _MemoryPointerWrite ($add, $Handle, $Offset, ...)
; Description: Reads a chain of pointers and writes the data to the destination address.
; Parameter(s): $address - The static memory address you want to start at. It must be in
; hex format (0x00000000).


Meine NomadMemory:

PHP Code:
;=================================================================================================
; Function:   
_MemoryOpen($iv_Pid[, $iv_DesiredAccess[, $iv_InheritHandle]])
Description:    Opens a process and enables all possible access rights to the process.  The
;               Process ID of the process is used to specify which process to open.  You must
;               call this function before calling _MemoryClose(), _MemoryRead(), or _MemoryWrite().
Parameter(s):  $iv_Pid The Process ID of the program you want to open.
;               
$iv_DesiredAccess - (optionalSet to 0x1F0FFF by default, which enables all
;                              possible access rights to the process specified by the
;                              Process ID.
;               
$if_InheritHandle - (optional) If this value is TRUEall processes created by
;                              this process will inherit the access handle.  Set to TRUE
;                              (1by default.  Set to 0 if you want it to be FALSE.
Requirement(s):   A valid process ID.
; Return 
Value(s):  On Success Returns an array containing the Dll handle and an open handle to
;                         the specified process.
;               
On Failure Returns 0
;               @Error No error.
;                      
Invalid $iv_Pid.
;                      
Failed to open Kernel32.dll.
;                      
Failed to open the specified process.
Author(s):        Nomad
Note(s):
;=================================================================================================
Func _MemoryOpen($iv_Pid$iv_DesiredAccess 0x1F0FFF$if_InheritHandle 1)

    If 
Not ProcessExists($iv_PidThen
        SetError
(1)
        Return 
0
    
EndIf

    
Local $ah_Handle[2] = [DllOpen('kernel32.dll')]

    If @
Error Then
        SetError
(2)
        Return 
0
    
EndIf

    
Local $av_OpenProcess DllCall($ah_Handle[0], 'int''OpenProcess''int'$iv_DesiredAccess'int'$if_InheritHandle'int'$iv_Pid)

    If @
Error Then
        DllClose
($ah_Handle[0])
        
SetError(3)
        Return 
0
    
EndIf

    
$ah_Handle[1] = $av_OpenProcess[0]

    Return 
$ah_Handle

EndFunc

;=================================================================================================
; Function:   
_MemoryRead($iv_Address$ah_Handle[, $sv_Type])
Description:    Reads the value located in the memory address specified.
Parameter(s):  $iv_Address The memory address you want to read fromIt must be in hex
;                          format (0x00000000).
;               
$ah_Handle An array containing the Dll handle and the handle of the open
;                         process as returned by _MemoryOpen().
;               
$sv_Type - (optionalThe "Type" of value you intend to read.  This is set to
;                        'dword'(32bit(4bytesigned integerby default.  See the help file
;                        for DllStructCreate for all types.
;                        
An example: If you want to read a word that is 15 characters in
;                        lengthyou would use 'char[16]'.
Requirement(s):   The $ah_Handle returned from _MemoryOpen.
; Return 
Value(s):  On Success Returns the value located at the specified address.
;               
On Failure Returns 0
;               @Error No error.
;                      
Invalid $ah_Handle.
;                      
$sv_Type was not a string.
;                      
$sv_Type is an unknown data type.
;                      
Failed to allocate the memory needed for the DllStructure.
;                      
Error allocating memory for $sv_Type.
;                      
Failed to read from the specified process.
Author(s):        Nomad
Note(s):      Values returned are in Decimal formatunless specified as 'char' typethen
;               they are returned in ASCII format.  Also note that size ('char[size]') for all
;               'char' types should be 1 greater than the actual size.
;=================================================================================================
Func _MemoryRead($iv_Address$ah_Handle$sv_Type 'dword')

    If 
Not IsArray($ah_HandleThen
        SetError
(1)
        Return 
0
    
EndIf

    
Local $v_Buffer DllStructCreate($sv_Type)

    If @
Error Then
        SetError
(@Error 1)
        Return 
0
    
EndIf

    
DllCall($ah_Handle[0], 'int''ReadProcessMemory''int'$ah_Handle[1], 'int'$iv_Address'ptr'DllStructGetPtr($v_Buffer), 'int'DllStructGetSize($v_Buffer), 'int''')

    If 
Not @Error Then
        Local $v_Value 
DllStructGetData($v_Buffer1)
        Return 
$v_Value
    
Else
        
SetError(6)
        Return 
0
    
EndIf

EndFunc

;=================================================================================================
; Function:   
_MemoryWrite($iv_Address$ah_Handle$v_Data[, $sv_Type])
Description:    Writes data to the specified memory address.
Parameter(s):  $iv_Address The memory address you want to write to.  It must be in hex
;                          format (0x00000000).
;               
$ah_Handle An array containing the Dll handle and the handle of the open
;                         process as returned by _MemoryOpen().
;               
$v_Data The data to be written.
;               
$sv_Type - (optionalThe "Type" of value you intend to write.  This is set to
;                        'dword'(32bit(4bytesigned integerby default.  See the help file
;                        for DllStructCreate for all types.
;                        
An example: If you want to write a word that is 15 characters in
;                        lengthyou would use 'char[16]'.
Requirement(s):   The $ah_Handle returned from _MemoryOpen.
; Return 
Value(s):  On Success Returns 1
;               On Failure Returns 0
;               @Error No error.
;                      
Invalid $ah_Handle.
;                      
$sv_Type was not a string.
;                      
$sv_Type is an unknown data type.
;                      
Failed to allocate the memory needed for the DllStructure.
;                      
Error allocating memory for $sv_Type.
;                      
$v_Data is not in the proper format to be used with the "Type"
;                         selected for $sv_Type, or it is out of range.
;                      
Failed to write to the specified process.
Author(s):        Nomad
Note(s):      Values sent must be in Decimal formatunless specified as 'char' typethen
;               they must be in ASCII format.  Also note that size ('char[size]') for all
;               'char' types should be 1 greater than the actual size.
;=================================================================================================
Func _MemoryWrite($iv_Address$ah_Handle$v_Data$sv_Type 'dword')

    If 
Not IsArray($ah_HandleThen
        SetError
(1)
        Return 
0
    
EndIf

    
Local $v_Buffer DllStructCreate($sv_Type)

    If @
Error Then
        SetError
(@Error 1)
        Return 
0
    
Else
        
DllStructSetData($v_Buffer1$v_Data)
        If @
Error Then
            SetError
(6)
            Return 
0
        
EndIf
    EndIf

    
DllCall($ah_Handle[0], 'int''WriteProcessMemory''int'$ah_Handle[1], 'int'$iv_Address'ptr'DllStructGetPtr($v_Buffer), 'int'DllStructGetSize($v_Buffer), 'int''')

    If 
Not @Error Then
        
Return 1
    
Else
        
SetError(7)
        Return 
0
    
EndIf

EndFunc

;=================================================================================================
; Function:   
_MemoryClose($ah_Handle)
Description:    Closes the process handle opened by using _MemoryOpen().
Parameter(s):  $ah_Handle An array containing the Dll handle and the handle of the open
;                         process as returned by _MemoryOpen().
Requirement(s):   The $ah_Handle returned from _MemoryOpen.
; Return 
Value(s):  On Success Returns 1
;               On Failure Returns 0
;               @Error No error.
;                      
Invalid $ah_Handle.
;                      
Unable to close the process handle.
Author(s):        Nomad
Note(s):
;=================================================================================================
Func _MemoryClose($ah_Handle)

    If 
Not IsArray($ah_HandleThen
        SetError
(1)
        Return 
0
    
EndIf

    
DllCall($ah_Handle[0], 'int''CloseHandle''int'$ah_Handle[1])
    If 
Not @Error Then
        DllClose
($ah_Handle[0])
        Return 
1
    
Else
        
DllClose($ah_Handle[0])
        
SetError(2)
        Return 
0
    
EndIf

EndFunc

;=================================================================================================
; Function:   
_MemoryPointerRead ($iv_Address$ah_Handle$av_Offset[, $sv_Type])
Description:    Reads a chain of pointers and returns an array containing the destination
;               address and the data at the address.
Parameter(s):  $iv_Address The static memory address you want to start atIt must be in
;                          hex format (0x00000000).
;               
$ah_Handle An array containing the Dll handle and the handle of the open
;                         process as returned by _MemoryOpen().
;               
$av_Offset An array of offsets for the pointers.  Each pointer must have an
;                         offset.  If there is no offset for a pointerenter 0 for that
;                         array dimension.
;               
$sv_Type - (optionalThe "Type" of data you intend to read at the destination
;                         address.  This is set to 'dword'(32bit(4bytesigned integerby
;                         default.  See the help file for DllStructCreate for all types.
Requirement(s):   The $ah_Handle returned from _MemoryOpen.
; Return 
Value(s):  On Success Returns an array containing the destination address and the value
;                         located at the address.
;               
On Failure Returns 0
;               @Error No error.
;                      
$av_Offset is not an array.
;                      
Invalid $ah_Handle.
;                      
$sv_Type is not a string.
;                      
$sv_Type is an unknown data type.
;                      
Failed to allocate the memory needed for the DllStructure.
;                      
Error allocating memory for $sv_Type.
;                      
Failed to read from the specified process.
Author(s):        Nomad
Note(s):      Values returned are in Decimal formatunless a 'char' type is selected.
;               
Set $av_Offset like this:
;               
$av_Offset[0] = NULL (not used)
;               
$av_Offset[1] = Offset for pointer 1 (all offsets must be in Decimal)
;               
$av_Offset[2] = Offset for pointer 2
;               etc...
;               (
The number of array dimensions determines the number of pointers)
;=================================================================================================
Func _MemoryPointerRead ($iv_Address$ah_Handle$av_Offset$sv_Type 'dword')

    If 
IsArray($av_OffsetThen
        
If IsArray($ah_HandleThen
            Local $iv_PointerCount 
UBound($av_Offset) - 1
        
Else
            
SetError(2)
            Return 
0
        
EndIf
    Else
        
SetError(1)
        Return 
0
    
EndIf

    
Local $iv_Data[2], $i
    Local $v_Buffer 
DllStructCreate('dword')

    For 
$i 0 to $iv_PointerCount

        
If $i $iv_PointerCount Then
            $v_Buffer 
DllStructCreate($sv_Type)
            If @
Error Then
                SetError
(@Error 2)
                Return 
0
            
EndIf

            
$iv_Address '0x' hex($iv_Data[1] + $av_Offset[$i])
            
DllCall($ah_Handle[0], 'int''ReadProcessMemory''int'$ah_Handle[1], 'int'$iv_Address'ptr'DllStructGetPtr($v_Buffer), 'int'DllStructGetSize($v_Buffer), 'int''')
            If @
Error Then
                SetError
(7)
                Return 
0
            
EndIf

            
$iv_Data[1] = DllStructGetData($v_Buffer1)

        ElseIf 
$i 0 Then
            DllCall
($ah_Handle[0], 'int''ReadProcessMemory''int'$ah_Handle[1], 'int'$iv_Address'ptr'DllStructGetPtr($v_Buffer), 'int'DllStructGetSize($v_Buffer), 'int''')
            If @
Error Then
                SetError
(7)
                Return 
0
            
EndIf

            
$iv_Data[1] = DllStructGetData($v_Buffer1)

        Else
            
$iv_Address '0x' hex($iv_Data[1] + $av_Offset[$i])
            
DllCall($ah_Handle[0], 'int''ReadProcessMemory''int'$ah_Handle[1], 'int'$iv_Address'ptr'DllStructGetPtr($v_Buffer), 'int'DllStructGetSize($v_Buffer), 'int''')
            If @
Error Then
                SetError
(7)
                Return 
0
            
EndIf

            
$iv_Data[1] = DllStructGetData($v_Buffer1)

        EndIf

    
Next

    $iv_Data
[0] = $iv_Address

    
Return $iv_Data

EndFunc

;=================================================================================================
; Function:   
_MemoryPointerWrite ($iv_Address$ah_Handle$av_Offset$v_Data[, $sv_Type])
Description:    Reads a chain of pointers and writes the data to the destination address.
Parameter(s):  $iv_Address The static memory address you want to start atIt must be in
;                          hex format (0x00000000).
;               
$ah_Handle An array containing the Dll handle and the handle of the open
;                         process as returned by _MemoryOpen().
;               
$av_Offset An array of offsets for the pointers.  Each pointer must have an
;                         offset.  If there is no offset for a pointerenter 0 for that
;                         array dimension.
;               
$v_Data The data to be written.
;               
$sv_Type - (optionalThe "Type" of data you intend to write at the destination
;                         address.  This is set to 'dword'(32bit(4bytesigned integerby
;                         default.  See the help file for DllStructCreate for all types.
Requirement(s):   The $ah_Handle returned from _MemoryOpen.
; Return 
Value(s):  On Success Returns the destination address.
;               
On Failure Returns 0.
;               @Error No error.
;                      
$av_Offset is not an array.
;                      
Invalid $ah_Handle.
;                      
Failed to read from the specified process.
;                      
$sv_Type is not a string.
;                      
$sv_Type is an unknown data type.
;                      
Failed to allocate the memory needed for the DllStructure.
;                      
Error allocating memory for $sv_Type.
;                      
$v_Data is not in the proper format to be used with the
;                         "Type" selected for $sv_Type, or it is out of range.
;                      
Failed to write to the specified process.
Author(s):        Nomad
Note(s):      Data written is in Decimal formatunless a 'char' type is selected.
;               
Set $av_Offset like this:
;               
$av_Offset[0] = NULL (not useddoesn't matter what's entered)
;               
$av_Offset[1] = Offset for pointer 1 (all offsets must be in Decimal)
;               
$av_Offset[2] = Offset for pointer 2
;               etc...
;               (
The number of array dimensions determines the number of pointers)
;=================================================================================================
Func _MemoryPointerWrite ($iv_Address$ah_Handle$av_Offset$v_Data$sv_Type 'dword')

    If 
IsArray($av_OffsetThen
        
If IsArray($ah_HandleThen
            Local $iv_PointerCount 
UBound($av_Offset) - 1
        
Else
            
SetError(2)
            Return 
0
        
EndIf
    Else
        
SetError(1)
        Return 
0
    
EndIf

    
Local $iv_StructData$i
    Local $v_Buffer 
DllStructCreate('dword')

    For 
$i 0 to $iv_PointerCount
        
If $i $iv_PointerCount Then
            $v_Buffer 
DllStructCreate($sv_Type)
            If @
Error Then
                SetError
(@Error 3)
                Return 
0
            
EndIf

            
DllStructSetData($v_Buffer1$v_Data)
            If @
Error Then
                SetError
(8)
                Return 
0
            
EndIf

            
$iv_Address '0x' hex($iv_StructData $av_Offset[$i])
            
DllCall($ah_Handle[0], 'int''WriteProcessMemory''int'$ah_Handle[1], 'int'$iv_Address'ptr'DllStructGetPtr($v_Buffer), 'int'DllStructGetSize($v_Buffer), 'int''')
            If @
Error Then
                SetError
(9)
                Return 
0
            
Else
                Return 
$iv_Address
            
EndIf
        ElseIf 
$i 0 Then
            DllCall
($ah_Handle[0], 'int''ReadProcessMemory''int'$ah_Handle[1], 'int'$iv_Address'ptr'DllStructGetPtr($v_Buffer), 'int'DllStructGetSize($v_Buffer), 'int''')
            If @
Error Then
                SetError
(3)
                Return 
0
            
EndIf

            
$iv_StructData DllStructGetData($v_Buffer1)

        Else
            
$iv_Address '0x' hex($iv_StructData $av_Offset[$i])
            
DllCall($ah_Handle[0], 'int''ReadProcessMemory''int'$ah_Handle[1], 'int'$iv_Address'ptr'DllStructGetPtr($v_Buffer), 'int'DllStructGetSize($v_Buffer), 'int''')
            If @
Error Then
                SetError
(3)
                Return 
0
            
EndIf

            
$iv_StructData DllStructGetData($v_Buffer1)

        EndIf
    
Next

EndFunc

;===================================================================================================

; Function........:  
_MemoryGetBaseAddress($ah_Handle$iHD)
;
Description.....:  Reads the 'Allocation Base' from the open process.
;
Parameter(s)....:  $ah_Handle An array containing the Dll handle and the handle of the open
;                               process as returned by _MemoryOpen().
;                    
$iHD - Return type:
;                       |
Hex (Default)
;                       |
Dec
;
Requirement(s)..:  A valid process ID.
;
; Return 
Value(s).:  On Success Returns the 'allocation Base' address and sets @Error to 0.
;                    On Failure Returns 0 and sets @Error to:
;                  |
Invalid $ah_Handle.
;                  |
Failed to find correct allocation address.
;                  |
Failed to read from the specified process.
;
Author(s).......:  NomadSzhlopp.
URL.............:  http://www.autoitscript.com/forum/index.php?showtopic=78834
Note(s).........:  Go to Www.CheatEngine.org for the latest version of CheatEngine.
;===================================================================================================

;===================================================================================================
; Function........:  
_MemoryGetBaseAddress($ah_Handle$iHD)
;
Description.....:  Reads the 'Allocation Base' from the open process.
;
Parameter(s)....:  $ah_Handle An array containing the Dll handle and the handle of the open
;                                process as returned by _MemoryOpen().
;                   
$iHD - Return type:
;                      |
Hex (Default)
;                      |
Dec
;
Requirement(s)..:  A valid process ID.
;
; Return 
Value(s).:  On Success Returns the 'allocation Base' address and sets @Error to 0.
;                   On Failure Returns 0 and sets @Error to:
;                      |
Invalid $ah_Handle.
;                      |
Failed to find correct allocation address.
;                      |
Failed to read from the specified process.
;
Author(s).......:  NomadSzhlopp.
URL.............:  http://www.autoitscript.com/forum/index.php?showtopic=78834
Note(s).........:  Go to Www.CheatEngine.org for the latest version of CheatEngine.
;===================================================================================================
Func _MemoryGetBaseAddress($ah_Handle$iHexDec 0)

    
Local $iv_Address 0x00100000
    Local $v_Buffer 
DllStructCreate('dword;dword;dword;dword;dword;dword;dword')
    
Local $vData
    Local $vType

    
If Not IsArray($ah_HandleThen
        SetError
(1)
        Return 
0
    
EndIf

    
DllCall($ah_Handle[0], 'int''VirtualQueryEx''int'$ah_Handle[1], 'int'$iv_Address'ptr'DllStructGetPtr($v_Buffer), 'int'DllStructGetSize($v_Buffer))

    If 
Not @Error Then

        $vData 
Hex(Int(DllStructGetData($v_Buffer2)))
        
$vType Hex(Int(DllStructGetData($v_Buffer3)))

        While 
$vType <> "00000080"
            
DllCall($ah_Handle[0], 'int''VirtualQueryEx''int'$ah_Handle[1], 'int'$iv_Address'ptr'DllStructGetPtr($v_Buffer), 'int'DllStructGetSize($v_Buffer))
            
$vData Hex(Int(DllStructGetData($v_Buffer2)))
            
$vType Hex(Int(DllStructGetData($v_Buffer3)))
            If 
Hex($iv_Address) = "01000000" Then ExitLoop
            $iv_Address 
+= 65536

        WEnd
        
If $vType "00000080" Then
            SetError
(0)
            If 
$iHexDec 1 Then
                
Return Dec($vData)
            Else
                Return 
$vData
            
EndIf

        Else
            
SetError(2)
            Return 
0
        
EndIf

    Else
        
SetError(3)
        Return 
0
    
EndIf

EndFunc 
Vielleicht weiß einer weiter :)
01/29/2017 10:57 alpines#2
Ist dein Spiel zufälligerweise 64-Bit? Denn der Wert der herauskommt liegt außerhalb des Wertebereiches von 2^32 (Bit).

Nomad kann glaube ich nur 32 Bit, du kannst es ja mit einer anderen UDF probieren.
Hier müsste auch irgendwo eine 64-Bit Variante sein KMemory oder wie die heißt.
01/29/2017 12:07 Stylerr#3
Ok, danke ich versuche es nachher mal mit KMemory, Nomad spinnt eh nur rum unter Win7 64.
Werde dann berichten.
E: Wenn ich 8-Stellige vars hab, ließt er sie aber richtig aus.
01/29/2017 13:28 alpines#4
Quote:
Originally Posted by Stylerr View Post
Ok, danke ich versuche es nachher mal mit KMemory, Nomad spinnt eh nur rum unter Win7 64.
Werde dann berichten.
E: Wenn ich 8-Stellige vars hab, ließt er sie aber richtig aus.
Ja ist ja auch logisch ne? 8 Stellen = 4 Bytes, 4 Byte = 4 * 8 Bit = 32 Bit.

Solange du 8-Stellige Adressen hast, liegen sie innerhalb des 32-Bit-Adressspektrums und können adressiert werden.
01/29/2017 16:37 Stylerr#5
Ah, langsam verstehe ich. Mit einer anderen UDF gehts!
Wer noch Probleme mit Nomad hat --> [Only registered and activated users can see links. Click Here To Register...]

Danke!
01/30/2017 12:24 BladeTiger12#6
Meine Erfahrung zu der _MemoryPointerRead/Write:

Hat bei mir aus irgendwelchen Gründen nie funktioniert.
Habe mir letztendlich eine eigene zusammen geschrieben bzw. alle Offsets einzeln dazu gerechnet.