So I got a bit tired of the confusion brought on by C++, and with the requirement to use a specific IDE for C#. Further to that, I got sick of sitting here typing code which I'm unlikely to use in my career in the near future. Result? Bring on the Python healer.
I got to this stage this morning (but now have to leave for work). Thought it might prove useful for someone should anyone here be interested in developing using Python.
Heres the code behind it:
memory.py:
Code:
import ctypes, win32ui, win32process ,win32api
class Memory:
def __init__(self):
# Read and write process memory methods from kernel32
self.rPM = ctypes.windll.kernel32.ReadProcessMemory
self.wPM = ctypes.windll.kernel32.WriteProcessMemory
# PROCESS_ALL_ACCESS is a flag typically set in kernel32, for simplicity we shall define it here
PROCESS_ALL_ACCESS = 0x1F0FFF
# Acquire a HWND for Tibia
self.HWND = win32ui.FindWindow("TibiaClient",None).GetSafeHwnd()
print("HWND : " + str(self.HWND))
# Acquire the ProcessID using our HWND
self.PID = win32process.GetWindowThreadProcessId(self.HWND)[1]
print("PID : " + str(self.PID))
# Acquire a Process object to work with
self.PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,self.PID)
print("HANDLE : " + str(self.PROCESS.handle))
# Enumerate Process MOdules to find the base address of Tibia
self.BASEADDRESSLIST = win32process.EnumProcessModules(self.PROCESS.handle)
# Take the first (C# "Default") base address from the list
self.BASEADDRESS = self.BASEADDRESSLIST[0]
print("BASEADDRESS : " + str(self.BASEADDRESS))
#ALL GLOBALS DEFINED
def ReadInt(self, Address):
data = 4294967295
self.rPM(self.PROCESS.handle,Address+self.BASEADDRESS,data,32,0)
return data
def ReadString(self, Address):
data = b"wah"
buff = ctypes.create_string_buffer(data, 32)
self.rPM(self.PROCESS.handle,Address+self.BASEADDRESS,buff,32,0)
val = ctypes.string_at(buff).decode("utf-8")
return val
main.py:
Code:
import memory
mem = memory.Memory()
print("Name from BattleList: " + mem.ReadString(5943964))
print("CID from BattleList: " + str(mem.ReadInt(5943960)))
Hope someone finds it useful