Как я могу получить истинную сумму базового адреса DLL и его смещения на Python? - PullRequest
1 голос
/ 27 октября 2019

Я не знаю много о С ++ и 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
...