Я не знаю много о С ++ и ctypes, пожалуйста, не пинайте меня сразу).
Если этот вопрос уже задавался - извините.
ЯНаписание программы для отслеживания состояния персонажа в игре.
У меня есть фрагмент кода Python, с его помощью я хочу получить чье-то значение из памяти, но я не понимаю, как суммировать базовые значения. Адрес DLL и его смещения ..
# with pywin32 get pid and loaded modules
.....
for i in range(len(modules)):
dllName = re.search('NWindow.DLL', win32process.GetModuleFileNameEx(processHandle,modules[i]))
if dllName:
dllAddress = modules[i]
print(hex(dllAddress),win32process.GetModuleFileNameEx(processHandle,modules[i]))
break
processHandle.close()
dllAddress += 0x009CF49C # Base DLL address + something from CE ..:D
offsets = [0x5AC, 0x200, 0x268, 0x6C4, 0x240] # Offsets list
buffer = (ctypes.c_byte * 4)()
bytesRead = ctypes.c_ulonglong(0)
pHandle = ctypes.windll.kernel32.OpenProcess(0x1F0FFF, False, get_pid('process.exe'))
ctypes.windll.kernel32.ReadProcessMemory(pHandle, dllAddress+sum(offsets), buffer, len(buffer),
ctypes.byref(bytesRead))
print(struct.unpack('i', buffer)[0])
Например: из Cheat Engine я получаю это представление (щелчок)
Добавление адреса нужной DLL и ее смещений вPython Я не получаю тот же адрес, что и CE:
CE: 0x0F386E40
Py: 0xDAD07B4
И, конечно, я не могу получить истинное значение с неправильного адреса .. Но если я просто поставил (динамический) адрес, найденный CE, я получаю истинное значение.
У меня недостаточно знаний о работе с оперативной памятью, помогите мне, пожалуйста ..)
Надеюсь, я прояснил вопрос ..
UPD: да, я это сделал)
def get_address(base_address, offsets):
ctypes.windll.kernel32.ReadProcessMemory(pHandle, base_address, buffer,
len(buffer), ctypes.byref(bytesRead))
addr = struct.unpack('i', buffer)[0]
for i in range(len(offsets)-1):
addr += offsets[i]
ctypes.windll.kernel32.ReadProcessMemory(pHandle, addr, buffer,
len(buffer), ctypes.byref(bytesRead))
addr = struct.unpack('i', buffer)[0]
result = addr + offsets[len(offsets)-1]
return result