Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > AutoIt
You last visited: Today at 17:02

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



_memoryread mit 64bit programmen geht nicht! - winapi - profi - frage

Discussion on _memoryread mit 64bit programmen geht nicht! - winapi - profi - frage within the AutoIt forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jul 2011
Posts: 13
Received Thanks: 0
Question _memoryread mit 64bit programmen geht nicht! - winapi - profi - frage

hallo, ich bin ganz neu hier und habe eine kniffeliges problem.
ich versuche verzweifelt mit der _memoryread - funktion aus der nomadmemory.au3 unter 64bit zu arbeiten. und zwar so, dass ich auch auf 64bit speicherbereiche benutzen kann. - leider erhalte ich nur nullwerte zurück ich habe schon versucht das problem zu lösen, es leider nicht geschafft.
so wie ich das sehe ist das problem, dass wie ProcessReadMemory - winapi mit int´s "versorgt" wird was ja nut 4bytes/32bit halten kann. also hab ich versucht das durch int_prt zu ersetzen, was (nach meinem verständnis) dann je nach kompilierung (32/64bit) prt oder int verwendet.
aber leider hat es das nicht gebracht, bzw bekomme ich immer noch nur nullen zurück.

hier mein beispiel in dem ich einfach mal eine speicherstelle versuche auszulesen deren adresse im 64bit bereich liegt und laut cheat engine 64bit natürlich keinen nullwert enthält. ... die abgeänderte nomadmemory.au3 ist auch schon im code enthalten.

ich hoffe ihr könnt helfen!

Code:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****


#include-once
#region _Memory
;==================================================================================
; Function:            SetPrivilege( $privilege, $bEnable )
; Description:        Enables (or disables) the $privilege on the current process
;                   (Probably) requires administrator privileges to run
;
; Author(s):        Larry (from autoitscript.com's Forum)
; Notes(s):
; http://www.autoitscript.com/forum/index.php?s=&showtopic=31248&view=findpost&p=223999
;==================================================================================

Func SetPrivilege( $privilege, $bEnable )
    Const $TOKEN_ADJUST_PRIVILEGES = 0x0020
    Const $TOKEN_QUERY = 0x0008
    Const $SE_PRIVILEGE_ENABLED = 0x0002
    Local $hToken, $SP_auxret, $SP_ret, $hCurrProcess, $nTokens, $nTokenIndex, $priv
    $nTokens = 1
    $LUID = DLLStructCreate("dword;int")
    If IsArray($privilege) Then    $nTokens = UBound($privilege)
    $TOKEN_PRIVILEGES = DLLStructCreate("dword;dword[" & (3 * $nTokens) & "]")
    $NEWTOKEN_PRIVILEGES = DLLStructCreate("dword;dword[" & (3 * $nTokens) & "]")
    $hCurrProcess = DLLCall("kernel32.dll","hwnd","GetCurrentProcess")
    $SP_auxret = DLLCall("advapi32.dll","int","OpenProcessToken","hwnd",$hCurrProcess[0],   _
            "int",BitOR($TOKEN_ADJUST_PRIVILEGES,$TOKEN_QUERY),"int*",0)
    If $SP_auxret[0] Then
        $hToken = $SP_auxret[3]
        DLLStructSetData($TOKEN_PRIVILEGES,1,1)
        $nTokenIndex = 1
        While $nTokenIndex <= $nTokens
            If IsArray($privilege) Then
                $ntokenvar=$ntokenindex-1
                $priv = $privilege[$ntokenvar]
            Else
                $priv = $privilege
            EndIf
            $ret = DLLCall("advapi32.dll","int","LookupPrivilegeValue","str","","str",$priv,   _
                    "ptr",DLLStructGetPtr($LUID))
            If $ret[0] Then
                If $bEnable Then
                    DLLStructSetData($TOKEN_PRIVILEGES,2,$SE_PRIVILEGE_ENABLED,(3 * $nTokenIndex))
                Else
                    DLLStructSetData($TOKEN_PRIVILEGES,2,0,(3 * $nTokenIndex))
                EndIf
                DLLStructSetData($TOKEN_PRIVILEGES,2,DllStructGetData($LUID,1),(3 * ($nTokenIndex-1)) + 1)
                DLLStructSetData($TOKEN_PRIVILEGES,2,DllStructGetData($LUID,2),(3 * ($nTokenIndex-1)) + 2)
                DLLStructSetData($LUID,1,0)
                DLLStructSetData($LUID,2,0)
            EndIf
            $nTokenIndex += 1
        WEnd
        $ret = DLLCall("advapi32.dll","int","AdjustTokenPrivileges","hwnd",$hToken,"int",0,   _
                "ptr",DllStructGetPtr($TOKEN_PRIVILEGES),"int",DllStructGetSize($NEWTOKEN_PRIVILEGES),   _
                "ptr",DllStructGetPtr($NEWTOKEN_PRIVILEGES),"int*",0)
        $f = DLLCall("kernel32.dll","int","GetLastError")
    EndIf
    $NEWTOKEN_PRIVILEGES=0
    $TOKEN_PRIVILEGES=0
    $LUID=0
    If $SP_auxret[0] = 0 Then Return 0
    $SP_auxret = DLLCall("kernel32.dll","int","CloseHandle","hwnd",$hToken)
    If Not $ret[0] And Not $SP_auxret[0] Then Return 0
    return $ret[0]
EndFunc  ;==>SetPrivilege
;=================================================================================================
; AutoIt Version:    3.1.127 (beta)
; Language:            English
; Platform:            All Windows
; Author:            Nomad
; Requirements:        These functions will only work with beta.
;=================================================================================================
; Credits:    wOuter - These functions are based on his original _Mem() functions.  But they are
;            easier to comprehend and more reliable.  These functions are in no way a direct copy
;            of his functions.  His functions only provided a foundation from which these evolved.
;=================================================================================================
;
; Functions:
;
;=================================================================================================
; 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 - (optional) Set 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 TRUE, all processes created by
;                                        this process will inherit the access handle.  Set to TRUE
;                                        (1) by 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 - 0 = No error.
;                             1 = Invalid $iv_Pid.
;                             2 = Failed to open Kernel32.dll.
;                             3 = 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_Pid) Then
        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_ptr', 'OpenProcess', 'int_ptr', $iv_DesiredAccess, 'int_ptr', $if_InheritHandle, 'int_ptr', $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 from. 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().
;                    $sv_Type - (optional) The "Type" of value you intend to read.  This is set to
;                                'dword'(32bit(4byte) signed integer) by default.  See the help file
;                                for DllStructCreate for all types.
;                                An example: If you want to read a word that is 15 characters in
;                                length, you 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 - 0 = No error.
;                             1 = Invalid $ah_Handle.
;                             2 = $sv_Type was not a string.
;                             3 = $sv_Type is an unknown data type.
;                             4 = Failed to allocate the memory needed for the DllStructure.
;                             5 = Error allocating memory for $sv_Type.
;                             6 = Failed to read from the specified process.
; Author(s):        Nomad
; Note(s):            Values returned are in Decimal format, unless specified as a 'char' type, then
;                    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_Handle) Then
        SetError(1)
        Return 0
    EndIf
    
    Local $v_Buffer = DllStructCreate($sv_Type)
    
    If @Error Then
        SetError(@Error + 1)
        Return 0
    EndIf
    MsgBox(0,"$iv_Address:",$iv_Address)
    MsgBox(0,"$ah_Handle[1]:",$ah_Handle[1])
    DllCall($ah_Handle[0], 'int_ptr', 'ReadProcessMemory', 'int_ptr', $ah_Handle[1], 'int_ptr', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int_ptr', DllStructGetSize($v_Buffer), 'int_ptr', '')
    
    If Not @Error Then
        Local $v_Value = DllStructGetData($v_Buffer, 1)
        Return $v_Value
    Else
        SetError(6)
        Return 0
    EndIf
    
EndFunc


SetPrivilege("SeDebugPrivilege", 1)

$addy = '7FEFB2F7A80'
$process = "MineSweeper.exe"
$pid = ProcessExists($process)
$MemOpen = _MemoryOpen($pid)
$Readout = _MemoryRead("0x"&$addy, $MemOpen, "byte[1000]")
MsgBox(0,"result", $Readout)
Frennzy is offline  
Old 07/23/2011, 14:51   #2
 
~kau~'s Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 634
Received Thanks: 794
Damit hab ich mich noch nie beschäftigt ;D
Aber die Addy sieht etwas komisch aus und probier mal ob es geht wenn du "byte[1000]" wegläst.
~kau~ is offline  
Old 07/23/2011, 15:05   #3
 
elite*gold: 0
Join Date: Jul 2011
Posts: 13
Received Thanks: 0
na ja, die addy ist halt eine die länger ist als eine 32bit = 4byte (z.B. 00 41 23 45)
bei nativen 64bit anwendungen sind ja 8 byte adressierbar. deshalb ist die adresse auch auch länger ... die führenden nullen kann man ja normalerweise weglassen, aber mit selbigen wäre die adresse das hier: "00 00 07 FE FB 2F 7A 80" ... was aber keinen unterschied macht .... wenn ich byte[1000] weglasse wird nur ein dword = 4byte ausgelesen ... bringt mich leider auch nicht weiter
Frennzy is offline  
Old 07/23/2011, 19:05   #4
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
autoit erkennt solche werte nicht als zahlen an

0xFFFFFFFF ist die maximale hexadezimalzahl die man in dieser notation nutzen kann.

alles was darüber liegt, muss in dezimal notation geschrieben werden =)

dann solltest du auch keine probleme mit 64bit speicherbereichen haben
lolkop is offline  
Old 07/23/2011, 19:42   #5
 
elite*gold: 0
Join Date: Jul 2011
Posts: 13
Received Thanks: 0
na ja, deshalb verwende ich ja
den umweg über $addy = '7FEFB2F7A80' und hänge dann "0x" bei der übergabe vor...
kann ich denn einfach der winapi funktion ReadProcessMemory einen dezimalwert geben !??! die doku sagt folgendes:
Quote:
__in LPCVOID lpBaseAddress,
lpBaseAddress [in]
A pointer to the base address in the specified process from which to read. Before any data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for read access, and if it is not accessible the function fails.
wie/woher weisst du das ich einfach eine dezimalzahl nehmen kann !?
(würde mich mal interessieren)

wie auch immer, ich habe deinen rat befolgt und folgendes probiert:
Code:
$addy = '8791717280384' ; ist die dezimalzahl aus 7FEFB2F7A80
$process = "MineSweeper.exe"
$pid = ProcessExists($process)
$MemOpen = _MemoryOpen($pid)
$Readout = _MemoryRead($addy, $MemOpen, "byte[1000]") ; '0x' entfernt
MsgBox(0,"result", $Readout)
leider ohne erfolg (es werden nur nullen zurückgegeben statt des wertes der in CE steht.)

ich würde dich bitten meinen oben aufgeführten code mal abzuändern, wenn du wirklich weisst wie es geht... ich sitze hier schon viel zu lange dran und bin schon ganz verpeilt. danke
Frennzy is offline  
Old 07/23/2011, 20:23   #6
 
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
Ändere den Datentyp des 2. Parameters von ReadProcessMemory von "INT_PTR" zu "ptr" oder "QWORD".
KDeluxe is offline  
Old 07/23/2011, 20:46   #7
 
elite*gold: 0
Join Date: Jul 2011
Posts: 13
Received Thanks: 0
gleiches ergebnis bei 'prt' (Nullen)
und bei 'qword' gitbs nur eine 0 zurück.
Frennzy is offline  
Old 07/23/2011, 20:48   #8
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by Frennzy View Post
wie/woher weisst du das ich einfach eine dezimalzahl nehmen kann !?
das ganze wird nichtmehr als zahl erkannt. ob du jetzt 0x8 schreibst oder 8 ist für autoit absolut egal. es wird immer als 8 interpretiert.

0x8 ist eben nur eine andere notation... da autoit das ganze sowieso immer als dezimalzahl weiter gibt, ist es hierbei egal ob du für die adresse eine dezimal oder hexadezimal zahl nutzt.
lolkop is offline  
Old 07/23/2011, 20:48   #9
 
| Moep |'s Avatar
 
elite*gold: 0
Join Date: Apr 2008
Posts: 1,079
Received Thanks: 438
Probiers mal mit #RequireAdmin am Anfang deines Scripts.
| Moep | is offline  
Old 07/23/2011, 21:13   #10
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
versuch dir die funktion mal etwa so zus chreiben:
Code:
Func ReadProcessMemory($hProcess, $lpBaseAddress, $type = 'dword', $dll = 'kernel32.dll')
	Local $lpBuffer = DllStructCreate($type)
	DllCall($dll, 'int', 'ReadProcessMemory', 'hwnd', $hProcess, 'ptr', $lpBaseAddress, 'ptr', DllStructGetPtr($lpBuffer), 'long', DllStructGetSize($lpBuffer), 'ptr', '')
	Return DllStructGetData($lpBuffer, 1)
EndFunc
lolkop is offline  
Old 07/23/2011, 21:18   #11
 
elite*gold: 0
Join Date: Jul 2011
Posts: 13
Received Thanks: 0
Quote:
Originally Posted by lolkop View Post
das ganze wird nichtmehr als zahl erkannt. ob du jetzt 0x8 schreibst oder 8 ist für autoit absolut egal. es wird immer als 8 interpretiert.

0x8 ist eben nur eine andere notation... da autoit das ganze sowieso immer als dezimalzahl weiter gibt, ist es hierbei egal ob du für die adresse eine dezimal oder hexadezimal zahl nutzt.
okey, wieder was gelernt, also nutze ich jetzt den dezimalwert also so wie oben schon geschrieben:

Code:
$addy = '8791717280384' ; ist die dezimalzahl aus 7FEFB2F7A80
$process = "MineSweeper.exe"
$pid = ProcessExists($process)
$MemOpen = _MemoryOpen($pid)
$Readout = _MemoryRead($addy, $MemOpen, "byte[1000]") ; '0x' entfernt
MsgBox(0,"result", $Readout)
das ganze garniert mit dem 'prt' wie von KillerDeluxe empfohlen:

Code:
  DllCall($ah_Handle[0], 'int_ptr', 'ReadProcessMemory', 'int_ptr', $ah_Handle[1], 'ptr', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int_ptr', DllStructGetSize($v_Buffer), 'int_ptr', '')
und das noch dazu:

Quote:
Originally Posted by | Moep | View Post
Probiers mal mit #RequireAdmin am Anfang deines Scripts.
sollte bei mir nicht nötig sein, da ich meine UAC koplett deaktivert habe.
den noch habe ich es dervollständigkeit halber eingefügt und getestet probiert.

das und die anderen änderungen zusammen brachten leider wieder alles nichts außer die 1000 nullen
Frennzy is offline  
Old 07/23/2011, 21:20   #12
 
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
Quote:
Originally Posted by Frennzy View Post
gleiches ergebnis bei 'prt' (Nullen)
und bei 'qword' gitbs nur eine 0 zurück.
Das hat einen einfachen Grund, du hast schlicht und ergreifend etwas falsch gemacht. Ich habe die Funktionen entsprechend geändert und es funktioniert alles:

PHP Code:
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=y

Func _MemoryOpen($iv_Pid$iv_DesiredAccess 0x1F0FFF$if_InheritHandle 1)
    If 
Not ProcessExists($iv_PidThen Return SetError(1""0)

    
Local $ah_Handle[2] = [DllOpen("kernel32.dll")]
    If @
error Then Return SetError(2""0)

    
Local $av_OpenProcess DllCall($ah_Handle[0], "HANDLE""OpenProcess""DWORD"$iv_DesiredAccess"int"$if_InheritHandle"DWORD"$iv_Pid)
    If @
error Then
        DllClose
($ah_Handle[0])
        Return 
SetError(3""0)
    EndIf

    
$ah_Handle[1] = $av_OpenProcess[0]
    Return 
SetError(0""$ah_Handle)
EndFunc

Func _MemoryRead
($iv_Address$ah_Handle$sv_Type "dword")
    If 
Not IsArray($ah_HandleThen Return SetError(1""0)

    
Local $v_Buffer DllStructCreate($sv_Type)
    If @
error Then Return SetError(@error 1""0)

    
DllCall($ah_Handle[0], "int""ReadProcessMemory""HANDLE"$ah_Handle[1], "ptr"$iv_Address"ptr"DllStructGetPtr($v_Buffer), "ULONG_PTR"DllStructGetSize($v_Buffer), "int"0)
    If @
error Then Return SetError(6""0)

    Return 
SetError(0""DllStructGetData($v_Buffer1))
EndFunc

$Base 
8791717280384
$Handle 
_MemoryOpen(ProcessExists("MineSweeper.exe"))
If @
error Then
    MsgBox
(48"Fehler""Der Prozess konnte nicht geöffnet werden!")
Else
    
$Read _MemoryRead($Base$Handle"byte[1000]")
    If @
error Then
        MsgBox
(48"Fehler""Ein Fehler ist aufgetreten!" & @CR "Fehlercode: " & @error)
    Else
        
MsgBox(0"Ergebnis"$Read)
    EndIf
EndIf 
Hier noch ein Beweis (obwohl es nicht nötig ist):
KDeluxe is offline  
Thanks
1 User
Old 07/23/2011, 21:36   #13
 
elite*gold: 0
Join Date: Jul 2011
Posts: 13
Received Thanks: 0
Quote:
Originally Posted by lolkop View Post
versuch dir die funktion mal etwa so zus chreiben:
Code:
Func ReadProcessMemory($hProcess, $lpBaseAddress, $type = 'dword', $dll = 'kernel32.dll')
	Local $lpBuffer = DllStructCreate($type)
	DllCall($dll, 'int', 'ReadProcessMemory', 'hwnd', $hProcess, 'ptr', $lpBaseAddress, 'ptr', DllStructGetPtr($lpBuffer), 'long', DllStructGetSize($lpBuffer), 'ptr', '')
	Return DllStructGetData($lpBuffer, 1)
EndFunc
hier so ^^ umgeschrieben.... returniert eine einzelne Null

Code:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#RequireAdmin

#include-once
#region _Memory


SetPrivilege("SeDebugPrivilege", 1)
$process = "MineSweeper.exe"
$pid = ProcessExists($process)
$MemOpen = _MemoryOpen($pid)
$Readout = ReadProcessMemory($MemOpen, '8791709219456')
MsgBox(0,"result", $Readout)


Func ReadProcessMemory($hProcess, $lpBaseAddress, $type = 'dword', $dll = 'kernel32.dll')
	Local $lpBuffer = DllStructCreate($type)
	DllCall($dll, 'int', 'ReadProcessMemory', 'hwnd', $hProcess, 'ptr', $lpBaseAddress, 'ptr', DllStructGetPtr($lpBuffer), 'long', DllStructGetSize($lpBuffer), 'ptr', '')
	Return DllStructGetData($lpBuffer, 1)
EndFunc



;==================================================================================
; Function:            SetPrivilege( $privilege, $bEnable )
; Description:        Enables (or disables) the $privilege on the current process
;                   (Probably) requires administrator privileges to run
;
; Author(s):        Larry (from autoitscript.com's Forum)
; Notes(s):
; http://www.autoitscript.com/forum/index.php?s=&showtopic=31248&view=findpost&p=223999
;==================================================================================

Func SetPrivilege( $privilege, $bEnable )
    Const $TOKEN_ADJUST_PRIVILEGES = 0x0020
    Const $TOKEN_QUERY = 0x0008
    Const $SE_PRIVILEGE_ENABLED = 0x0002
    Local $hToken, $SP_auxret, $SP_ret, $hCurrProcess, $nTokens, $nTokenIndex, $priv
    $nTokens = 1
    $LUID = DLLStructCreate("dword;int")
    If IsArray($privilege) Then    $nTokens = UBound($privilege)
    $TOKEN_PRIVILEGES = DLLStructCreate("dword;dword[" & (3 * $nTokens) & "]")
    $NEWTOKEN_PRIVILEGES = DLLStructCreate("dword;dword[" & (3 * $nTokens) & "]")
    $hCurrProcess = DLLCall("kernel32.dll","hwnd","GetCurrentProcess")
    $SP_auxret = DLLCall("advapi32.dll","int","OpenProcessToken","hwnd",$hCurrProcess[0],   _
            "int",BitOR($TOKEN_ADJUST_PRIVILEGES,$TOKEN_QUERY),"int*",0)
    If $SP_auxret[0] Then
        $hToken = $SP_auxret[3]
        DLLStructSetData($TOKEN_PRIVILEGES,1,1)
        $nTokenIndex = 1
        While $nTokenIndex <= $nTokens
            If IsArray($privilege) Then
                $ntokenvar=$ntokenindex-1
                $priv = $privilege[$ntokenvar]
            Else
                $priv = $privilege
            EndIf
            $ret = DLLCall("advapi32.dll","int","LookupPrivilegeValue","str","","str",$priv,   _
                    "ptr",DLLStructGetPtr($LUID))
            If $ret[0] Then
                If $bEnable Then
                    DLLStructSetData($TOKEN_PRIVILEGES,2,$SE_PRIVILEGE_ENABLED,(3 * $nTokenIndex))
                Else
                    DLLStructSetData($TOKEN_PRIVILEGES,2,0,(3 * $nTokenIndex))
                EndIf
                DLLStructSetData($TOKEN_PRIVILEGES,2,DllStructGetData($LUID,1),(3 * ($nTokenIndex-1)) + 1)
                DLLStructSetData($TOKEN_PRIVILEGES,2,DllStructGetData($LUID,2),(3 * ($nTokenIndex-1)) + 2)
                DLLStructSetData($LUID,1,0)
                DLLStructSetData($LUID,2,0)
            EndIf
            $nTokenIndex += 1
        WEnd
        $ret = DLLCall("advapi32.dll","int","AdjustTokenPrivileges","hwnd",$hToken,"int",0,   _
                "ptr",DllStructGetPtr($TOKEN_PRIVILEGES),"int",DllStructGetSize($NEWTOKEN_PRIVILEGES),   _
                "ptr",DllStructGetPtr($NEWTOKEN_PRIVILEGES),"int*",0)
        $f = DLLCall("kernel32.dll","int","GetLastError")
    EndIf
    $NEWTOKEN_PRIVILEGES=0
    $TOKEN_PRIVILEGES=0
    $LUID=0
    If $SP_auxret[0] = 0 Then Return 0
    $SP_auxret = DLLCall("kernel32.dll","int","CloseHandle","hwnd",$hToken)
    If Not $ret[0] And Not $SP_auxret[0] Then Return 0
    return $ret[0]
EndFunc  ;==>SetPrivilege
;=================================================================================================
; AutoIt Version:    3.1.127 (beta)
; Language:            English
; Platform:            All Windows
; Author:            Nomad
; Requirements:        These functions will only work with beta.
;=================================================================================================
; Credits:    wOuter - These functions are based on his original _Mem() functions.  But they are
;            easier to comprehend and more reliable.  These functions are in no way a direct copy
;            of his functions.  His functions only provided a foundation from which these evolved.
;=================================================================================================
;
; Functions:
;
;=================================================================================================
; 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 - (optional) Set 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 TRUE, all processes created by
;                                        this process will inherit the access handle.  Set to TRUE
;                                        (1) by 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 - 0 = No error.
;                             1 = Invalid $iv_Pid.
;                             2 = Failed to open Kernel32.dll.
;                             3 = 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_Pid) Then
        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_ptr', 'OpenProcess', 'int_ptr', $iv_DesiredAccess, 'int_ptr', $if_InheritHandle, 'int_ptr', $iv_Pid)
    
    If @Error Then
        DllClose($ah_Handle[0])
        SetError(3)
        Return 0
    EndIf
    
    $ah_Handle[1] = $av_OpenProcess[0]
    
    Return $ah_Handle
    
EndFunc
Frennzy is offline  
Old 07/23/2011, 21:42   #14
 
elite*gold: 0
Join Date: Jul 2011
Posts: 13
Received Thanks: 0
Quote:
Originally Posted by KillerDeluxe View Post
Das hat einen einfachen Grund, du hast schlicht und ergreifend etwas falsch gemacht. Ich habe die Funktionen entsprechend geändert und es funktioniert alles:

PHP Code:
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=y

Func _MemoryOpen($iv_Pid$iv_DesiredAccess 0x1F0FFF$if_InheritHandle 1)
    If 
Not ProcessExists($iv_PidThen Return SetError(1""0)

    
Local $ah_Handle[2] = [DllOpen("kernel32.dll")]
    If @
error Then Return SetError(2""0)

    
Local $av_OpenProcess DllCall($ah_Handle[0], "HANDLE""OpenProcess""DWORD"$iv_DesiredAccess"int"$if_InheritHandle"DWORD"$iv_Pid)
    If @
error Then
        DllClose
($ah_Handle[0])
        Return 
SetError(3""0)
    EndIf

    
$ah_Handle[1] = $av_OpenProcess[0]
    Return 
SetError(0""$ah_Handle)
EndFunc

Func _MemoryRead
($iv_Address$ah_Handle$sv_Type "dword")
    If 
Not IsArray($ah_HandleThen Return SetError(1""0)

    
Local $v_Buffer DllStructCreate($sv_Type)
    If @
error Then Return SetError(@error 1""0)

    
DllCall($ah_Handle[0], "int""ReadProcessMemory""HANDLE"$ah_Handle[1], "ptr"$iv_Address"ptr"DllStructGetPtr($v_Buffer), "ULONG_PTR"DllStructGetSize($v_Buffer), "int"0)
    If @
error Then Return SetError(6""0)

    Return 
SetError(0""DllStructGetData($v_Buffer1))
EndFunc

$Base 
8791717280384
$Handle 
_MemoryOpen(ProcessExists("MineSweeper.exe"))
If @
error Then
    MsgBox
(48"Fehler""Der Prozess konnte nicht geöffnet werden!")
Else
    
$Read _MemoryRead($Base$Handle"byte[1000]")
    If @
error Then
        MsgBox
(48"Fehler""Ein Fehler ist aufgetreten!" & @CR "Fehlercode: " & @error)
    Else
        
MsgBox(0"Ergebnis"$Read)
    EndIf
EndIf 
Hier noch ein Beweis (obwohl es nicht nötig ist):
danke... ich bin erstmal erleichtert, dass es bei dir funktioniert... andererseits erhalte ich bei deinem code auch wieder nullen ... wenn es an am code nicht liegt, woran könnte es dann liegen ? - die rechte hab ich ausgestellt und habe auch mit totalcommander wie gewohnt vollen zugriff ohne "admin-anfrage" ....
ich habe wirklich keine idee was es sein könnte !?
Frennzy is offline  
Old 07/24/2011, 11:16   #15


 
buFFy!'s Avatar
 
elite*gold: 1826
Join Date: Mar 2009
Posts: 4,310
Received Thanks: 6,287
das lesen des speichers einer 64bit applikation aus einer 32bit applikation funktioniert nur wenn das highword der 32bit addresse == 0 ist. da du eine 64bit addresse verwendest solltest du eventuell mal versuchen da ganze als 64bit zu kompilieren.

um ehrlich zu sein verwirrt mich die addresse etwas. kenne mich aber zu wenig mit au3 aus um zu der interpretation was zu sagen. und anscheinend ging das ja bei killer.
buFFy! is offline  
Thanks
1 User
Reply

Tags
64 bit, autoit, nomad, _readmemory


Similar Threads Similar Threads
[Frage]Banword geht nicht
09/12/2010 - Metin2 Private Server - 4 Replies
Hallo com, Da ich einige GM codes (bannen) wollte hab ich auch ein TuT gefunden. Man musste einfach in die DB bei Banword das belibige GM Value einfügen z.b /stun /kill /dc ... Aber leider funktioniert das bei mir nicht. Habe auch InGame schon /reload gemacht. Was mache ich falsch? Und kann man bei dem Banword auch einfügen das manche items man nicht rufen kann? z.b /i und die vlaue eintragen`? Ich Hoffe jemand kann mir helfen =)
Alle nicht gebrauchte Programmen schließen?
06/11/2010 - Technical Support - 9 Replies
Hey, wie man der Überschrift schon entnehmen kann brauche ich ein Programm was mir meine Festplatte trotz laufender Programme formatiert, ich möchte den Pc komplett Formatieren das wirklich alles weg ist auch Windows ! Habe keine Recovery Cd aber der ist eh halt und ich will ein anderen Betriebssystem installieren! MfG
[FRAGE]Filezilla geht nicht
02/06/2010 - Metin2 Private Server - 0 Replies
Tag, wie oben gesagt geht filezilla nicht das steht immer "kritischer fehler"
[Frage] Einloggen geht nicht?!
06/24/2009 - Metin2 Private Server - 5 Replies
Ich hab hier schon unzählige Threads gelesen, aber kam nie was bei raus oO Undzwar hab ich mich gestern Abend um 10:45 im SD2 ausgeloggt.. Immer wenn ich mich jetzt einloggen will bleibt der beim Einloggbild stehen ( DU WIRST MIT DEM SERVER VERBUNDEN) Selbst nach 1h passiert nix?! Was kann ich tun?
[C++ newbie] WinApi gui frage
04/14/2009 - C/C++ - 7 Replies
HI leute, seit vorgestern habe ich angefangen mich fest mit c++ zu beschäftigen. Mein Ziel ist ein CHARM oder wie das heißt halt bei Multiplayern Models hervorheben. Beispiel wie man oft bei CS/S sieht Blaue oder Rote Models. Oder Aimbot. Aber ich hab an GTA:SA gedacht, weil man das sehr schnell starten kann. Und warum nicht für sa:mp aimbot? Aber na klar muss man sich von unten nach oben durch arbeiten^^ fing ich mit Basics und memorys an. War schon mir schwer genug weil es kaum Tutorials...



All times are GMT +1. The time now is 17:05.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.