ReadProcessMemory 64 бита

dtr315

Новичок
Пользователь
Сен 7, 2020
3
0
1
Доброго времени суток. Пытаюсь считать регистр памяти из чужой программы с помощью функции ReadProcessMemory.
Все хорошо, пока я использую 4-х байтные адреса. Но как только ввожу адрес больше 4-х байт, сразу возникает ошибка:
ctypes.ArgumentError: argument 2: <class 'OverflowError'>: int too long to convert

Естественно гугл мне в помощь. Решения нашел. Даже два:
1. Изменить 'address' на 'ctypes.c_void_p(address)' в вызове ReadProcessMemory.
2. Переназначить структуру ReadProcessMemory с помощью restype и argtypes, даже привели пример, который я честно и скопировал в текущий код.
После тестов обоих решений выяснил, что переменная с адресом теперь просто обрезается до 4-х байт. Как правило, получаем несуществующий адрес, и программа выдает ошибку 229. 4-х байтные адреса, как и раньше, работают.

Уже от себя присвоил в argtypes переменной адреса тип c_ulonglong и c_uint64 вместо LPCVOID, попытавшись насильно скормить все 64 бита. Дело сдвинулось с мертвой точки и питон выдал ошибку: OSError: exception: access violation writing 0x00000001

На этом мои мысли закончились, если кто поможет, буду весьма благодарен.
Phyton 3.7, Windows 10 64-bit.

Код:
from ctypes import *
from ctypes.wintypes import *

OpenProcess = windll.kernel32.OpenProcess
ReadProcessMemory = windll.kernel32.ReadProcessMemory
ReadProcessMemory.restype = BOOL
ReadProcessMemory.argtypes = [HANDLE, LPCVOID, LPVOID, c_size_t, POINTER(ctypes.c_size_t)]
CloseHandle = windll.kernel32.CloseHandle

PROCESS_ALL_ACCESS = 0x001F0FFF
PROCESS_VM_READ = 0x0010

# откуда считываем
pid = 0x1CC8  .
address = 0x7FFCEC5D72D4
# сколько байт
bufferSize = 1
buffer = create_string_buffer(bufferSize)
bytesRead = c_ulong(0)

processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
if processHandle != 0:
    print("Process successful opened")
    if ReadProcessMemory(processHandle, address, buffer, bufferSize, byref(bytesRead)):
        print(buffer.value)
    else:
        ErrorNum = GetLastError()
        print("Error Read Memory: ", ErrorNum, FormatError(ErrorNum))
else:
    ErrorNum = GetLastError()
    print("Error on open process: ", ErrorNum, FormatError(ErrorNum))

CloseHandle(processHandle)
 
Последнее редактирование:

dtr315

Новичок
Пользователь
Сен 7, 2020
3
0
1
Проблема решена. Ночное бдение не прошло даром. Ларчик открывался просто, хотя и не в том направлении куда я копал.
В используемой среде программирования запускалась 32 битная версия Phyton'а. Соответственно, она не понимала, что от нее хотят.
Все это время я пытался починить рабочий код ><
 

Форум IT Специалистов