AutoIt Memory Writing Not Working menu

User Tag List

Results 1 to 4 of 4
  1. #1
    Boomkin101's Avatar Active Member
    Reputation
    32
    Join Date
    May 2007
    Posts
    110
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    AutoIt Memory Writing Not Working

    Hi everyone,

    I am writing a script for vanilla wow 1.12.1, intending to create my own teleport hack / tool. I am using a library called NomadMemory which seems to be the standard memory manipulation library for autoit. The problem I am having is that writing to memory does not seem to be working, however reading from the exact same address returns the correct values. Hopefully someone here who has dealt with this kind of thing might have more insight, I am also running everything as administrator. Find below my full code

    Code:
    #RequireAdmin
    SetPrivilege("SeDebugPrivilege", 1)
    
    $WoWProcess = _MemoryOpen(WinGetProcess("World of Warcraft"))
    $xAddress = 0x00C62524
    $yAddress = 0x00C62528
    $zAddress = 0x00225C28
    
    Func GetX()
       return _MemoryRead($xAddress, $WoWProcess, 'float')
    EndFunc
    
    Func GetY()
       return _MemoryRead($yAddress, $WoWProcess, 'float')
    EndFunc
    
    Func GetZ()
       return _MemoryRead($zAddress, $WoWProcess, 'float')
    EndFunc
    
    Func SetX($data)
       _MemoryWrite($xAddress, $WoWProcess, $data, 'float')
    EndFunc
    
    Func SetY($data)
       _MemoryWrite($yAddress, $WoWProcess, $data, 'float')
    EndFunc
    
    Func SetZ($data)
       _MemoryWrite($zAddress, $WoWProcess, $data, 'float')
    EndFunc
    Code:
    #include-once
    #region _Memory
    ;==================================================================================
    ; 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.
    ;					$iv_InheritHandle - (optional) If this value is TRUE, all processes
    ;										created by this process will inherit the access
    ;										handle.  Set to 1 (TRUE) by default.  Set to 0
    ;										if you want it FALSE.
    ; Requirement(s):	None.
    ; 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, $iv_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', 'OpenProcess', 'int', $iv_DesiredAccess, 'int', $iv_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 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]' since a 'char' is 8 bits (1 byte) in size.
    ; 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
    	
    	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_Buffer, 1)
    		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 which 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 - (optional) The "Type" of value you intend to write.
    ;								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 write a
    ;								word that is 15 characters in length, you would use
    ;								'char[16]' since a 'char' is 8 bits (1 byte) in size.
    ; Return Value(s):	On Success - Returns 1
    ;					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 = $v_Data is not in the proper format to be used with the
    ;								 "Type" selected for $sv_Type, or it is out of range.
    ;							 7 = Failed to write to the specified process.
    ; Author(s):		Nomad
    ; Note(s):			Values sent must be in Decimal format, unless specified as a
    ;					'char' type, then 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_Handle) Then
    		SetError(1)
            Return 0
    	EndIf
    	
    	Local $v_Buffer = DllStructCreate($sv_Type)
    	
    	If @Error Then
    		SetError(@Error + 1)
    		Return 0
    	Else
    		DllStructSetData($v_Buffer, 1, $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().
    ; Return Value(s):	On Success - Returns 1
    ;					On Failure - Returns 0
    ;					@Error - 0 = No error.
    ;							 1 = Invalid $ah_Handle.
    ;							 2 = Unable to close the process handle.
    ; Author(s):		Nomad
    ; Note(s):
    ;==================================================================================
    Func _MemoryClose($ah_Handle)
    	
    	If Not IsArray($ah_Handle) Then
    		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:			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 $MY_TOKEN_ADJUST_PRIVILEGES = 0x0020
        Const $MY_TOKEN_QUERY = 0x0008
        Const $MY_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($MY_TOKEN_ADJUST_PRIVILEGES,$MY_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
                    $priv = $privilege[$nTokenIndex-1]
                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,$MY_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
    
    ;===================================================================================================
    ; 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:
    ;                       |0 = Hex (Default)
    ;                       |1 = 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:
    ;                       |1 = Invalid $ah_Handle.
    ;                       |2 = Failed to find correct allocation address.
    ;                       |3 = Failed to read from the specified process.
    ;
    ; Author(s).......:  Nomad. Szhlopp.
    ; 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_Handle) Then
            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(DllStructGetData($v_Buffer, 2))
            $vType = Hex(DllStructGetData($v_Buffer, 3))
            
            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(DllStructGetData($v_Buffer, 2))
                $vType = Hex(DllStructGetData($v_Buffer, 3))
                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   ;==>_MemoryGetBaseAddress
    
    #endregion

    AutoIt Memory Writing Not Working
  2. #2
    Jadd's Avatar 🐸 Premium Seller
    Reputation
    1515
    Join Date
    May 2008
    Posts
    2,433
    Thanks G/R
    81/336
    Trade Feedback
    1 (100%)
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)
    Well, it would probably help if you told us what the actual problem was instead of "it isn't working". What isn't working? Is there a problem with WriteProcessMemory or something?

  3. #3
    JuJuBoSc's Avatar Banned for scamming CoreCoins Purchaser
    Reputation
    1019
    Join Date
    May 2007
    Posts
    922
    Thanks G/R
    1/3
    Trade Feedback
    1 (100%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    ^ what Jadd said, one a side note, I don't think writing to that static address will do anything.

  4. #4
    3rdParty's Avatar Sergeant
    Reputation
    45
    Join Date
    Aug 2010
    Posts
    39
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Disclaimer: I am a beginner at Memory Editing too.

    As far as I know, you can't just write to the static XYZ addresses. I'm working on something similar for 2.4.3 atm. You need to use Pointers for XYZ.
    Besides that you have to adjust camera pointers and stuff. (Didn't get there yet either.)

    This is the function I'm currently working on. I don't know if it's going to help as I still have problems getting it to work properly.
    Nomad required ofc.

    Code:
    Func _PlayerSetLoc($i, $c)
       If $i = "x" Then
    		 _MemoryWrite($PlayerBase + 0xbf0, $handle, $c)
       ElseIf $i = "y" Then
    		 _MemoryWrite($PlayerBase + 0xbf4, $handle, $c)
       ElseIf $i = "z" Then
    		 _MemoryWrite($PlayerBase + 0xbf8, $handle, $c)
       EndIf
    EndFunc
    Edit:

    Finished my Porting Script:

    Code:
    Func _SetPlayerLoc($x, $y, $z) ;Set the Player's Location (PORT! :D)
       _MemoryWrite(GetMemLocByGUID($PlayerGUID) + $unitObject_XCord, $handle, $x, 'float')
       _MemoryWrite(GetMemLocByGUID($PlayerGUID) + $unitObject_YCord, $handle, $y, 'float')
       _MemoryWrite(GetMemLocByGUID($PlayerGUID) + $unitObject_ZCord, $handle, $z, 'float')
    EndFunc
    In comparison with my first approach you can see that im not writing to the XYZ Pointers, but to the objectmanager. I'm using the Players GUID and a function provided by gononono64. I changed it a bit. the input format of the $guid is 0x0000000000000000.

    Code:
    Func GetMemLocByGUID($guid) ;input pattern "0xXXXXXXXXXXXXXXXX" ;======= credits to gononono64 on ownedcore.com =======
    
       $NextObject = _MemoryRead("0x" & Hex($curMgr + $curMgr_FirstObject), $handle, "dword") ;Read the first wow object by adding our current manager address and our first object offset together
       $ObjType = _MemoryRead("0x" & Hex($NextObject + $object_Type), $handle, "dword");next get the object type buy adding our first object and our Objtype offset together  and reading that
    
       While (($ObjType <= 7) And ($ObjType > 0));If the return of object type is less than or equal to 7 (which it should always be) and more than 0 in the case that we do have an object in the list than do a while loop.
    		;NOTE: if there is an object in the list, objType will have to be = 1 to 7
    		;If our object plus the GUIDoffset = the GUID we are looking for (example our localplayer GUID) …
    
    	  If "0x" & Hex(_MemoryRead($NextObject + $object_GUID, $handle, "UINT64")) = $guid Then ; …then return our object
    		 Return $NextObject ;found what we wanted.
    	  EndIf
    
    	  $NextObject = _MemoryRead("0x" & Hex($NextObject + $object_NextObject), $handle, "dword");if no return happens (stays in the function) then cycle through the objects using our next object offset on our next object (might also be called current object)
    	  $ObjType = _MemoryRead("0x" & Hex($NextObject + $object_Type), $handle, "dword");We will also need to see the type
       Wend
    
       Return 0;if we find nothing Return 0 (address are probably wrong or you messed up code)
    EndFunc
    Last edited by 3rdParty; 06-02-2015 at 11:28 AM.

Similar Threads

  1. LF Help, AutoIT Read/Write Memory.
    By Dequality in forum Programming
    Replies: 1
    Last Post: 08-09-2016, 06:32 AM
  2. AutoIt/AutoHotKey... not working?
    By FattyXP in forum Path of Exile
    Replies: 7
    Last Post: 02-19-2013, 06:51 AM
  3. Wow glider is not working..
    By dragonmonster in forum World of Warcraft General
    Replies: 0
    Last Post: 10-24-2006, 06:29 PM
  4. weird model edits not working :S
    By nozzie in forum WoW ME Questions and Requests
    Replies: 2
    Last Post: 10-20-2006, 08:51 AM
  5. WoW Glider, key not working?
    By Shadowman2418 in forum World of Warcraft General
    Replies: 3
    Last Post: 07-28-2006, 03:49 AM
All times are GMT -5. The time now is 04:19 AM. Powered by vBulletin® Version 4.2.3
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.
Google Authenticator verification provided by Two-Factor Authentication (Free) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search