[GUIDE] HOW TO CREATE A WOW BOT USING AUTOIT (MEMORY READING)
Hi Every One.
Must Say Thanks to Devon he was the one who teach me how to Memory Read WoW
His Guide For Noobs --> http://www.mmowned.com/forums/world-...ete-newbs.html
Ok I am not going to go Into Details on How everything works but instead I am just going to share with your guys some working code. This is all working for WoW Version 4.2.0 14333.
Its all Base on Gononono64 Tutorial but with Working Code !!!
HOW TO GET PLAYER GUID (Global Unique ID) WOW Version 4.2.0 14333.
Code:
;--------------------------------------------------------------------------------
;Getting My Player GUID
;--------------------------------------------------------------------------------
#include <NomadMemory.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;--------------------------------------------------------------------------------
; Offsets Object Manager
; Offset and Pointer for Wow 4.2.0 14333 (Rebase 06-28-2011)
;--------------------------------------------------------------------------------
Global Const $ClientConnection = 0x97DA48 ;The first 2 are you create you manager from the baseaddress wow
Global Const $CurrMgrOffset = 0x463C
Global Const $FirstObjectOffset = 0xB4 ;The next one is to get the address of your first object ONLY
Global Const $NextObjectOffset = 0x3C ;To cycle through the object you need this offset
Global Const $localPlayerGUIDOffset = 0xB8
Global Const $GameObjGUIDOffset = 0x30 ;This next one is to find the objects type : 1 to 7
Global Const $GameObjTypeOffset = 0x14 ;And this one is to find the objects GUID
Global Const $DescriptorOffset = 0x8
;Open WoW Process to enable Memory Reading and Get the WoW Base Address
$ProcessID = ProcessExists("wow.exe")
$WowProcess = _MemoryOpen($ProcessID)
;Getting WoWBase Address
$WowBase = GetWoWBaseAddress($ProcessID)
;1) Getting CurrentManager_Pre
$currMgr_pre = _MemoryRead("0x" & Hex($WowBase + $ClientConnection), $WowProcess , "dword")
;2) Getting CurrentManager
$currMgr = _MemoryRead("0x" & Hex($currMgr_pre + $CurrMgrOffset), $WowProcess , "dword")
;Getting My Player GUID (Player Global Unique ID)
$pGUID = _MemoryRead("0x" & Hex($currMgr + $localPlayerGUIDOffset), $WowProcess , "UINT64") ;Player Guid
MsgBox(4096,"Player Name", "PLAYER HEALTH ---> " & $pGUID)
Func GetWoWBaseAddress($ProcessID)
$HSNAP = DllCall("Kernel32.dll", "HANDLE", "CreateToolhelp32Snapshot", "DWORD", 8, "DWORD", $ProcessID)
$STMODULE = DllStructCreate("DWORD dwSize;DWORD th32ModuleID;DWORD th32ProcessID;" & "DWORD GlblcntUsage;DWORD ProccntUsage;ptr modBaseAddr;" & "DWORD modBaseSize;HANDLE hModule;WCHAR szModule[256];" & "WCHAR szExePath[260]")
DllStructSetData($STMODULE, "dwSize", DllStructGetSize($STMODULE))
$RET = DllCall("Kernel32.dll", "BOOLEAN", "Module32FirstW", "HANDLE", $HSNAP[0], "ptr", DllStructGetPtr($STMODULE))
IF ($RET[0] = False) Then
DllCall("Kernel32.dll", "BOOLEAN", "CloseHandle", "HANDLE", $HSNAP[0])
Return 0
Else
$RET[0] = True
Do
If DllStructGetData($STMODULE, "szModule") = "Wow.exe" Then
DllCall("Kernel32.dll", "BOOLEAN", "CloseHandle", "HANDLE", $HSNAP[0])
Return DllStructGetData($STMODULE, "modBaseAddr")
EndIf
$RET = DllCall("Kernel32.dll", "BOOLEAN", "Module32NextW", "HANDLE", $HSNAP[0], "ptr", DllStructGetPtr($STMODULE))
Until $RET[0] = False
EndIf
EndFunc
HOW TO GET PLAYER X,Y,Z AND ROTATION WOW Version 4.2.0 14333.
Code:
;--------------------------------------------------------------------------------
;Getting My Player X,Y,Z and Rotation
;--------------------------------------------------------------------------------
#include <NomadMemory.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#RequireAdmin
;--------------------------------------------------------------------------------
; Offsets Object Manager
; Offset and Pointer for Wow 4.2.0 14333 (Rebase 06-28-2011)
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
;public enum Player
;--------------------------------------------------------------------------------
$playerName = 0x97DA88
;--------------------------------------------------------------------------------
;internal enum WowObject
;--------------------------------------------------------------------------------
Global Const $UnitPosXOffset = 0x790
Global Const $UnitPosYOffset = 0x790 + 0x4
Global Const $UnitPosZOffset = 0x790 + 0x8
Global Const $UnitRotationOffset = 0x790 + 0x10
;--------------------------------------------------------------------------------
; Offsets Object Manager
;--------------------------------------------------------------------------------
Global Const $ClientConnection = 0x97DA48 ;The first 2 are you create you manager from the baseaddress wow
Global Const $CurrMgrOffset = 0x463C
Global Const $FirstObjectOffset = 0xB4 ;The next one is to get the address of your first object ONLY
Global Const $NextObjectOffset = 0x3C ;To cycle through the object you need this offset
Global Const $localPlayerGUIDOffset = 0xB8
Global Const $GameObjGUIDOffset = 0x30 ;This next one is to find the objects type : 1 to 7
Global Const $GameObjTypeOffset = 0x14 ;And this one is to find the objects GUID
Global Const $DescriptorOffset = 0x8
;Open WoW Process to enable Memory Reading and Get the WoW Base Address
$ProcessID = ProcessExists("wow.exe")
$WowProcess = _MemoryOpen($ProcessID)
;Getting WoWBase Address
$WowBase = GetWoWBaseAddress($ProcessID)
;1) Getting CurrentManager_Pre
$currMgr_pre = _MemoryRead("0x" & Hex($WowBase + $ClientConnection), $WowProcess , "dword")
;2) Getting CurrentManager
$currMgr = _MemoryRead("0x" & Hex($currMgr_pre + $CurrMgrOffset), $WowProcess , "dword")
;Getting My Player GUID
$pGUID = _MemoryRead("0x" & Hex($currMgr + $localPlayerGUIDOffset), $WowProcess , "UINT64") ;Player Guid
$ObjectMemLoc = GetMemLocByGUID($pGUID)
MsgBox(4096,"Player Name", "PLAYER NAME ---> " & GetPlayerName() & @CRLF & _
"Player GUID ---> " & $pGUID & @CRLF & _
"GetPlayerX ---> " & GetPlayerX() & @CRLF & _
"GetPlayerY ---> " & GetPlayerY() & @CRLF & _
"GetPlayerZ ---> " & GetPlayerZ() & @CRLF & _
"Rotation ---> " & GetPlayerRotation())
Func GetPlayerName()
return _memoryread($WowBase + $playerName, $WowProcess, "char[20]")
EndFunc
Func GetPlayerX()
return floor(_MemoryRead("0x" & Hex($ObjectMemLoc + $UnitPosXOffset), $WowProcess, "float"))
EndFunc
Func GetPlayerY()
return floor(_MemoryRead("0x" & Hex($ObjectMemLoc + $UnitPosYOffset), $WowProcess, "float"))
EndFunc
Func GetPlayerZ()
return floor(_MemoryRead("0x" & Hex($ObjectMemLoc + $UnitPosZOffset), $WowProcess, "float"))
EndFunc
Func GetPlayerRotation()
return floor(_MemoryRead("0x" & Hex($ObjectMemLoc + $UnitRotationOffset), $WowProcess, "float"))
EndFunc
Func GetMemLocByGUID($guid)
;Read the first wow object by adding our current manager address and our first object offset together
$NextObject = _MemoryRead("0x" & Hex($currMgr + $FirstObjectOffset), $WowProcess , "dword")
;next get the object type buy adding our first object and our Objtype offset together and reading that
$ObjType = _MemoryRead("0x" & Hex($NextObject + $GameObjTypeOffset), $WowProcess , "dword")
;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.
while (($ObjType <= 7) And ($ObjType > 0))
;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 (_MemoryRead("0x" & Hex($NextObject + $GameObjGUIDOffset), $WowProcess , "UINT64") = $guid) Then ; …then return our object
Return $NextObject ;found what we wanted.
EndIf
;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)
$NextObject = _MemoryRead("0x" & Hex($NextObject + $NextObjectOffset), $WowProcess , "dword")
;We will also need to see the type
$ObjType = _MemoryRead("0x" & Hex($NextObject + $GameObjTypeOffset), $WowProcess , "dword")
Wend
;if we find nothing Return 0 (address are probably wrong or you messed up code)
Return 0;
EndFunc
Func GetWoWBaseAddress($ProcessID)
$HSNAP = DllCall("Kernel32.dll", "HANDLE", "CreateToolhelp32Snapshot", "DWORD", 8, "DWORD", $ProcessID)
$STMODULE = DllStructCreate("DWORD dwSize;DWORD th32ModuleID;DWORD th32ProcessID;" & "DWORD GlblcntUsage;DWORD ProccntUsage;ptr modBaseAddr;" & "DWORD modBaseSize;HANDLE hModule;WCHAR szModule[256];" & "WCHAR szExePath[260]")
DllStructSetData($STMODULE, "dwSize", DllStructGetSize($STMODULE))
$RET = DllCall("Kernel32.dll", "BOOLEAN", "Module32FirstW", "HANDLE", $HSNAP[0], "ptr", DllStructGetPtr($STMODULE))
IF ($RET[0] = False) Then
DllCall("Kernel32.dll", "BOOLEAN", "CloseHandle", "HANDLE", $HSNAP[0])
Return 0
Else
$RET[0] = True
Do
If DllStructGetData($STMODULE, "szModule") = "Wow.exe" Then
DllCall("Kernel32.dll", "BOOLEAN", "CloseHandle", "HANDLE", $HSNAP[0])
Return DllStructGetData($STMODULE, "modBaseAddr")
EndIf
$RET = DllCall("Kernel32.dll", "BOOLEAN", "Module32NextW", "HANDLE", $HSNAP[0], "ptr", DllStructGetPtr($STMODULE))
Until $RET[0] = False
EndIf
EndFunc
HOW TO GET PLAYER HEALTH WOW Version 4.2.0 14333.
Code:
;--------------------------------------------------------------------------------
;Getting My Player Health
;--------------------------------------------------------------------------------
#include <NomadMemory.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#RequireAdmin
;--------------------------------------------------------------------------------
; Offsets Object Manager
; Offset and Pointer for Wow 4.2.0 14333 (Rebase 06-28-2011)
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
;public enum Player
;--------------------------------------------------------------------------------
$playerName = 0x97DA88
;--------------------------------------------------------------------------------
;public enum UnitFields
;--------------------------------------------------------------------------------
$UNIT_FIELD_HEALTH = 0x68
;--------------------------------------------------------------------------------
; Offsets Object Manager
;--------------------------------------------------------------------------------
Global Const $ClientConnection = 0x97DA48 ;The first 2 are you create you manager from the baseaddress wow
Global Const $CurrMgrOffset = 0x463C
Global Const $FirstObjectOffset = 0xB4 ;The next one is to get the address of your first object ONLY
Global Const $NextObjectOffset = 0x3C ;To cycle through the object you need this offset
Global Const $localPlayerGUIDOffset = 0xB8
Global Const $GameObjGUIDOffset = 0x30 ;This next one is to find the objects type : 1 to 7
Global Const $GameObjTypeOffset = 0x14 ;And this one is to find the objects GUID
Global Const $DescriptorOffset = 0x8
;Open WoW Process to enable Memory Reading and Get the WoW Base Address
$ProcessID = ProcessExists("wow.exe")
$WowProcess = _MemoryOpen($ProcessID)
;Getting WoWBase Address
$WowBase = GetWoWBaseAddress($ProcessID)
;1) Getting CurrentManager_Pre
$currMgr_pre = _MemoryRead("0x" & Hex($WowBase + $ClientConnection), $WowProcess , "dword")
;2) Getting CurrentManager
$currMgr = _MemoryRead("0x" & Hex($currMgr_pre + $CurrMgrOffset), $WowProcess , "dword")
;Getting My Player GUID
$pGUID = _MemoryRead("0x" & Hex($currMgr + $localPlayerGUIDOffset), $WowProcess , "UINT64") ;Player Guid
;Gettin My Player Address
$ObjectMemLoc = GetMemLocByGUID($pGUID)
MsgBox(4096,"Player Name", "PLAYER NAME ---> " & GetPlayerName() & @CRLF & _
"PLAYER HEALTH ---> " & GetPlayerHealth())
Func GetPlayerName()
return _memoryread($WowBase + $playerName, $WowProcess, "char[20]")
EndFunc
Func GetPlayerHealth()
$pDescriptor = _MemoryRead("0x" & Hex($ObjectMemLoc + $DescriptorOffset), $WowProcess , "dword");<---essentially says that you want to use a descriptor (aka health)
$pHealth = _MemoryRead("0x" & Hex($pDescriptor + $UNIT_FIELD_HEALTH), $WowProcess ,"dword");<---looks up your health
return $pHealth
EndFunc
Func GetMemLocByGUID($guid)
;Read the first wow object by adding our current manager address and our first object offset together
$NextObject = _MemoryRead("0x" & Hex($currMgr + $FirstObjectOffset), $WowProcess , "dword")
;next get the object type buy adding our first object and our Objtype offset together and reading that
$ObjType = _MemoryRead("0x" & Hex($NextObject + $GameObjTypeOffset), $WowProcess , "dword")
;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.
while (($ObjType <= 7) And ($ObjType > 0))
;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 (_MemoryRead("0x" & Hex($NextObject + $GameObjGUIDOffset), $WowProcess , "UINT64") = $guid) Then ; …then return our object
Return $NextObject ;found what we wanted.
EndIf
;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)
$NextObject = _MemoryRead("0x" & Hex($NextObject + $NextObjectOffset), $WowProcess , "dword")
;We will also need to see the type
$ObjType = _MemoryRead("0x" & Hex($NextObject + $GameObjTypeOffset), $WowProcess , "dword")
Wend
;if we find nothing Return 0 (address are probably wrong or you messed up code)
Return 0;
EndFunc
Func GetWoWBaseAddress($ProcessID)
$HSNAP = DllCall("Kernel32.dll", "HANDLE", "CreateToolhelp32Snapshot", "DWORD", 8, "DWORD", $ProcessID)
$STMODULE = DllStructCreate("DWORD dwSize;DWORD th32ModuleID;DWORD th32ProcessID;" & "DWORD GlblcntUsage;DWORD ProccntUsage;ptr modBaseAddr;" & "DWORD modBaseSize;HANDLE hModule;WCHAR szModule[256];" & "WCHAR szExePath[260]")
DllStructSetData($STMODULE, "dwSize", DllStructGetSize($STMODULE))
$RET = DllCall("Kernel32.dll", "BOOLEAN", "Module32FirstW", "HANDLE", $HSNAP[0], "ptr", DllStructGetPtr($STMODULE))
IF ($RET[0] = False) Then
DllCall("Kernel32.dll", "BOOLEAN", "CloseHandle", "HANDLE", $HSNAP[0])
Return 0
Else
$RET[0] = True
Do
If DllStructGetData($STMODULE, "szModule") = "Wow.exe" Then
DllCall("Kernel32.dll", "BOOLEAN", "CloseHandle", "HANDLE", $HSNAP[0])
Return DllStructGetData($STMODULE, "modBaseAddr")
EndIf
$RET = DllCall("Kernel32.dll", "BOOLEAN", "Module32NextW", "HANDLE", $HSNAP[0], "ptr", DllStructGetPtr($STMODULE))
Until $RET[0] = False
EndIf
EndFunc
Oh and I made some Diagrams to help get my mind clear. I will share it too
It Took me a while to learn how to put this Code Working. Thanks for Reading! and If I learn something else I will keep updating !
If you got any questions please ask I will help you out!