I have part of my solution worked out so I'll post it here. The code might look a little convoluted to some of you because it's written in AutoItScript. I've been using AutoItScript for bot development because it's so well suited to that purpose (lots of really finite control over windows and objects without having to get my hands too dirty, and good ability to plug in COM objects too).
Here goes:
Const $uniquePatternOffset=0x374
Const $uniquePatternValue=0x007D0A7C
Const $uniquePatternOffset2=4
Const $uniquePatternValue2=3
Const $CurrentHealthOffset=0x4c0
Const $MaxHealthOffset=0x4D8
Const $CurrentManaOffset=0x4c4
Const $MaxManaOffset=0x4Dc
Const $OffsetSearchStep=0x1000
Const $maxSearchableMemory=0x70000000
Const $startSearchableMemory=0x400000
HotKeySet("^+!{ESC}","Abort") ; Ctrl Shift Alt {Esc}
SetPrivilege("SeDebugPrivilege", 1)
$handle = _MemOpen()
$offsets=findplayerdataoffset($handle)
Func findplayerdataoffset($handle)
$baseOffset=$startSearchableMemory
$baseOffset+=$uniquePatternOffset
$timerStart=TimerInit()
TrayTip("Begin Search. ","Looking for base offset.",2,1)
While $baseOffset<$maxSearchableMemory
$value=_WoWMemRead($baseOffset,$handle,'dword')
If $value=$uniquePatternValue Then
If _WoWMemRead($baseOffset-$uniquePatternOffset2,$handle,'dword')=$uniquePatternValue2 Then
$baseOffset-=$uniquePatternOffset ; Found our offset. Put offset back to xxxxx000
TrayTip("Found Location. ",Hex($baseOffset)&" "&Floor(TimerDiff($timerStart)/1000)&" seconds.",2,1)
Dim $dataarray
$dataarray=_ArrayCreate($baseOffset+$CurrentHealthOffset,$baseOffset+$MaxHealthOffset,$baseOffset+$CurrentManaOffset,$baseOffset+$MaxManaOffset)
Return $dataarray
ExitLoop
EndIf
EndIf
$baseOffset+=$OffsetSearchStep
WEnd
EndFunc
_MemClose($handle)
A couple of the functions like _MemClose() and _MemOpen() are just reusable pieces I wrote so I wouldn't have to go through the headache of changing the text by which the process handle is gotten should the game developer ever decide to change it (which they frequently do), but merely change the value of one global variable.
Anyway, it might seem unintelligible to you, and I myself have trouble understanding memory addressing and pointers at times still, but that's what I've come up with so far. That returns the player's health, max health, mana, and max mana. I'm now working on returning all objects near the player (monsters to kill) in an array, because I already can rotate the player towards a location using some math functions and the data on each monster contains its XYZ coords.
EDIT: forgot to make it actually do something.