149 lines
6.7 KiB
Go
149 lines
6.7 KiB
Go
package memory
|
|
|
|
import (
|
|
"encoding/binary"
|
|
)
|
|
|
|
type Offset struct {
|
|
GameData uintptr
|
|
UnitTable uintptr
|
|
UI uintptr
|
|
Hover uintptr
|
|
Expansion uintptr
|
|
RosterOffset uintptr
|
|
PanelManagerContainerOffset uintptr
|
|
WidgetStatesOffset uintptr
|
|
WaypointTableOffset uintptr
|
|
FPS uintptr
|
|
KeyBindingsOffset uintptr
|
|
KeyBindingsSkillsOffset uintptr
|
|
QuestInfo uintptr
|
|
TZ uintptr
|
|
Quests uintptr
|
|
Ping uintptr
|
|
LegacyGraphics uintptr
|
|
CharData uintptr
|
|
}
|
|
|
|
func calculateOffsets(process *Process) Offset {
|
|
// ignoring errors, always best practices
|
|
memory, _ := process.getProcessMemory()
|
|
|
|
// GameReader
|
|
pattern := process.FindPattern(memory, "\x44\x88\x25\x00\x00\x00\x00\x66\x44\x89\x25\x00\x00\x00\x00", "xxx????xxxx????")
|
|
bytes := process.ReadBytesFromMemory(pattern+0x3, 4)
|
|
offsetInt := uintptr(binary.LittleEndian.Uint32(bytes))
|
|
gameDataOffset := (pattern - process.moduleBaseAddressPtr) - 0x121 + offsetInt
|
|
|
|
// UnitTable
|
|
pattern = process.FindPattern(memory, "\x48\x03\xC7\x49\x8B\x8C\xC6", "xxxxxxx")
|
|
bytes = process.ReadBytesFromMemory(pattern+7, 4)
|
|
unitTableOffset := uintptr(binary.LittleEndian.Uint32(bytes))
|
|
|
|
// UI
|
|
pattern = process.FindPattern(memory, "\x40\x84\xed\x0f\x94\x05", "xxxxxx")
|
|
uiOffset := process.ReadUInt(pattern+6, Uint32)
|
|
uiOffsetPtr := (pattern - process.moduleBaseAddressPtr) + 10 + uintptr(uiOffset)
|
|
|
|
// Hover
|
|
pattern = process.FindPattern(memory, "\xc6\x84\xc2\x00\x00\x00\x00\x00\x48\x8b\x74", "xxx?????xxx")
|
|
hoverOffset := process.ReadUInt(pattern+3, Uint32) - 1
|
|
|
|
// Expansion
|
|
pattern = process.FindPattern(memory, "\x48\x8B\x05\x00\x00\x00\x00\x48\x8B\xD9\xF3\x0F\x10\x50\x00", "xxx????xxxxxxx?")
|
|
offsetPtr := uintptr(process.ReadUInt(pattern+3, Uint32))
|
|
expOffset := pattern - process.moduleBaseAddressPtr + 7 + offsetPtr
|
|
|
|
// Party members offset
|
|
pattern = process.FindPattern(memory, "\x02\x45\x33\xD2\x4D\x8B", "xxxxxx")
|
|
offsetPtr = uintptr(process.ReadUInt(pattern-3, Uint32))
|
|
rosterOffset := pattern - process.moduleBaseAddressPtr + 1 + offsetPtr
|
|
|
|
// PanelManagerContainer
|
|
pattern = process.FindPatternByOperand(memory, "\x48\x89\x05\x00\x00\x00\x00\x48\x85\xDB\x74\x1E", "xxx????xxxxx")
|
|
bytes = process.ReadBytesFromMemory(pattern, 8)
|
|
panelManagerContainerOffset := (pattern - process.moduleBaseAddressPtr) // uintptr(binary.LittleEndian.Uint64(bytes))
|
|
|
|
// WidgetStates
|
|
pattern = process.FindPattern(memory, "\x48\x8B\x0D\x00\x00\x00\x00\x4C\x8D\x44\x24\x00\x48\x03\xC2", "xxx????xxxx?xxx")
|
|
WidgetStatesPtr := process.ReadUInt(pattern+3, Uint32)
|
|
WidgetStatesOffset := pattern - process.moduleBaseAddressPtr + 7 + uintptr(WidgetStatesPtr)
|
|
|
|
// Waypoints
|
|
pattern = process.FindPattern(memory, "\x48\x89\x05\x00\x00\x00\x00\x0F\x11\x00", "xxx????xxx")
|
|
offsetBuffer := process.ReadUInt(pattern+3, Uint32)
|
|
WaypointTableOffset := pattern - process.moduleBaseAddressPtr + 7 + uintptr(offsetBuffer)
|
|
|
|
// FPS
|
|
pattern = process.FindPattern(memory, "\x8B\x1D\x00\x00\x00\x00\x48\x8D\x05\x00\x00\x00\x00\x48\x8D\x4C\x24\x40", "xx????xxx????xxxxx")
|
|
fpsOffsetPtr := uintptr(process.ReadUInt(pattern+2, Uint32))
|
|
fpsOffset := pattern - process.moduleBaseAddressPtr + 6 + fpsOffsetPtr
|
|
|
|
// Keybindings
|
|
pattern = process.FindPattern(memory, "\x48\x8D\x05\xAF\xEE", "xxxxx")
|
|
bytes = process.ReadBytesFromMemory(pattern+3, 4)
|
|
relativeOffset := int32(binary.LittleEndian.Uint32(bytes))
|
|
keyBindingsOffset := pattern - process.moduleBaseAddressPtr + 7 + uintptr(relativeOffset)
|
|
|
|
// KeyBindings Skills
|
|
pattern = process.FindPattern(memory, "\x0F\x10\x04\x24\x48\x6B\xC8\x1C\x48\x8D\x05", "xxxxxxxxxxx")
|
|
var keyBindingsSkillsOffset uintptr
|
|
bytes = process.ReadBytesFromMemory(pattern+11, 4)
|
|
relativeOffset = int32(binary.LittleEndian.Uint32(bytes))
|
|
keyBindingsSkillsOffset = uintptr(int64(pattern) + 15 + int64(relativeOffset))
|
|
|
|
// QuestInfo
|
|
pattern = process.FindPattern(memory, "\x48\x8B\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x45\x33\xE4", "xxx????x????xxx")
|
|
questInfoOffsetPtr := uintptr(process.ReadUInt(pattern+3, Uint32))
|
|
questInfoOffset := pattern - process.moduleBaseAddressPtr + 7 + questInfoOffsetPtr
|
|
|
|
// Terror Zones
|
|
pattern = process.FindPattern(memory, "\x48\x89\x05\xCC\xCC\xCC\xCC\x48\x8D\x05\xCC\xCC\xCC\xCC\x48\x89\x05\xCC\xCC\xCC\xCC\x48\x8D\x05\xCC\xCC\xCC\xCC\x48\x89\x15\xCC\xCC\xCC\xCC\x48\x89\x15", "xxx????xxx????xxx????xxx????xxx????xxx")
|
|
tzPtr := process.ReadUInt(pattern+3, Uint32)
|
|
tzOffset := pattern - process.moduleBaseAddressPtr + 7 + uintptr(tzPtr)
|
|
|
|
// Quest Bytes Data
|
|
pattern = process.FindPattern(memory, "\x42\xc6\x84\x28\x00\x00\x00\x00\x00\x49\xff\xc5\x49\x83\xfd\x29", "xxxx?????xxxxxxx")
|
|
bytes = process.ReadBytesFromMemory(pattern+4, 4)
|
|
questOffset := uintptr(binary.LittleEndian.Uint32(bytes))
|
|
questDataOffset := questOffset + 1
|
|
|
|
// Ping
|
|
pattern = process.FindPattern(memory, "\x48\x8B\x0D\xCC\xCC\xCC\xCC\x49\x2B\xC7", "xxx????xxx")
|
|
bytes = process.ReadBytesFromMemory(pattern+3, 4)
|
|
relativeOffset = int32(binary.LittleEndian.Uint32(bytes))
|
|
pingOffset := pattern - process.moduleBaseAddressPtr + 7 + uintptr(relativeOffset)
|
|
|
|
// LegacyGraphics
|
|
pattern = process.FindPattern(memory, "\x80\x3D\x00\x00\x00\x00\x00\x48\x8D\x54\x24\x30", "xx?????xxxxx")
|
|
legacyGfxPtr := uintptr(process.ReadUInt(pattern+2, Uint32))
|
|
legacyGfxOffset := pattern - process.moduleBaseAddressPtr + 7 + legacyGfxPtr
|
|
|
|
// CharData
|
|
pattern = process.FindPattern(memory, "\x48\x8D\x05\x00\x00\x00\x00\x89\x93\xF4\x0C\x00\x00", "xxx????xxxxxx")
|
|
bytes = process.ReadBytesFromMemory(pattern+3, 4)
|
|
relativeOffset = int32(binary.LittleEndian.Uint32(bytes))
|
|
charDataOffset := pattern - process.moduleBaseAddressPtr + 7 + uintptr(relativeOffset)
|
|
|
|
return Offset{
|
|
GameData: gameDataOffset,
|
|
UnitTable: unitTableOffset,
|
|
UI: uiOffsetPtr,
|
|
Hover: uintptr(hoverOffset),
|
|
Expansion: expOffset,
|
|
RosterOffset: rosterOffset,
|
|
PanelManagerContainerOffset: panelManagerContainerOffset,
|
|
WidgetStatesOffset: WidgetStatesOffset,
|
|
WaypointTableOffset: WaypointTableOffset,
|
|
FPS: fpsOffset,
|
|
KeyBindingsOffset: keyBindingsOffset,
|
|
KeyBindingsSkillsOffset: keyBindingsSkillsOffset,
|
|
QuestInfo: questInfoOffset,
|
|
TZ: tzOffset,
|
|
Quests: questDataOffset,
|
|
Ping: pingOffset,
|
|
LegacyGraphics: legacyGfxOffset,
|
|
CharData: charDataOffset,
|
|
}
|
|
}
|