Code:
;Memory Reading [WoW][4.2.0.14333] Info Dump Thread
;Main Goal of This Program is to get My Player Name from WoW
;
;CREDITS
;-------------------------------------------------------------------------
;gononono64 (Thread: [Guide] How to make a Wow bot for complete newbs!)
;-------------------------------------------------------------------------
;Link ->
;http://www.mmowned.com/forums/world-of-warcraft/bots-programs/memory-editing/319172-guide-how-make-wow-bot-complete-newbs.html
;-------------------------------------------------------------------------
;Thread: Need some help on my own GatherBot [AutoIt]
;-------------------------------------------------------------------------
;Link ->
;http://www.mmowned.com/forums/world-of-warcraft/bots-programs/memory-editing/320471-need-some-help-my-own-gatherbot-autoit.html
HotKeySet("{ESC}", "Terminate")
#include <NomadMemory.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#RequireAdmin
; Offsets Object Manager
Global Const $ClientConnection = 0x97DA48
Global Const $CurMgrOffset = 0x463C
Global Const $FirstObjectOffset = 0xB4
Global Const $NextObjectOffset = 0x3C
Global Const $PlayerGUID = 0xB8
Global Const $GameObjGUIDOffset = 0x30
Global Const $GameObjTypeOffset = 0x14
; Variables Corpse Player
Global Const $UnitPosXOffset = 0xA964A4
Global Const $UnitPosYOffset = 0xA964A4 + 0x4
Global Const $UnitPosZOffset = 0xA964A4 + 0x8
; Variables for Player Name
Global const $nameStorePtr= 0x9573D8 + 0x8
Global const $nameMaskOffset=0x024
Global const $nameBaseOffset=0x01c
Global const $nameStringOffset=0x020
$ProcessID = WinGetProcess("Wow.exe")
Global $WowBase = GetWoWBaseAddress($ProcessID)
$WowProcess = _MemoryOpen($ProcessID)
$currMgr_pre = _MemoryRead("0x" & Hex($WowBase + $ClientConnection), $WowProcess , "dword")
$currMgr = _MemoryRead("0x" & Hex($currMgr_pre + $CurMgrOffset), $WowProcess , "dword")
$pGUID = _MemoryRead("0x" & Hex($currMgr + $PlayerGUID), $WowProcess , "UINT64")
$pObjectMemLoc = GetMemLocByGUID($pGUID)
While 1
MsgBox(4096,"Player Name",GetPlayerName($pGUID))
exit
WEnd
Func GetPlayerName($fGUID)
$mask=_MemoryRead($WowBase + 0x9573D8 + 0x8 +0x024, $WowProcess)
$base=_MemoryRead($WowBase + 0x9573D8 + 0x8 +0x01c, $WowProcess)
$shortGUID = BitAnd($fGUID, 0xffffffff)
if ($mask=0xffffffff) Then
return ""
EndIf
$offset = 12 * BitAnd($mask, $shortGUID)
$current = _MemoryRead($base+$offset+8, $WowProcess)
$offset = _MemoryRead($base+$offset, $WowProcess)
if (BitAND($current, 0x1) = 0x1) Then
return ""
EndIf
$testGUID= _MemoryRead($current, $WowProcess)
while ($testGUID <> $shortGUID)
$current=_MemoryRead($current+$offset+4, $WowProcess)
if (BitAND($current, 0x1) = 0x1) Then
return ""
EndIf
$testGUID=_MemoryRead($current, $WowProcess)
WEnd
return _MemoryRead($current + 0x020, $WowProcess, "char[20]")
EndFunc
Func Terminate()
Exit 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
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