Обновление 1:
Я пробовал решение, приведенное ниже, используя buffer.value.decode()
. В результате получилось только (#
, что является шагом в правильном направлении, но я хочу получить 9000
. Когда я использую Cheat Engine для изменения значения адреса на 2000
, этот же метод приводит к ошибке UnicodeDecodeError: 'utf-8' can't decode byte 0xd0 in position 0: invalid continuation byte
. Так что я предполагаю, что у меня неправильная кодировка. Любое предложение о том, что я должен делать с этим?
Исходный вопрос:
Я пытаюсь использовать ReadProcessMemory из ctypes, чтобы получить значение из адреса в процессе. Кажется, я без проблем получаю байтовые данные, но мне трудно преобразовать их в соответствующую форму. Я использую Cheat Engine для проверки данных с помощью стороннего метода и использую его для изменения данных в адресе. Я уверен, что у меня есть правильный вывод адреса из моего скрипта. Я ожидаю вернуть значение 9000. Полный код, который я использую, приведен ниже, но я читаю память в буфер типа c_char_p (из ctypes). Я пробовал несколько способов преобразования значения в строку и его печати. используя только str(buffer)
, как и ожидалось, я возвращаю байтовое представление как c_char_p(b'(#')
. Когда я пытаюсь преобразовать данные с помощью str(int.from_bytes(buffer, sys.byteorder))
, я получаю обратно 43586512
. Я видел в другом месте возможность конвертировать из байтов с помощью buffer.decode()
, но, похоже, это не для версии ctypes, поскольку c_char_p не имеет метода декодирования (что может означать, что мне следует использовать другой подход для получения значения адреса процесса, отличного от ctypes?) . Может ли кто-нибудь указать, что мне нужно сделать, чтобы правильно получить значение этого адреса в форме, которую я ищу? Спасибо много!
Код:
from ctypes import *
from ctypes.wintypes import *
OpenProcess = windll.kernel32.OpenProcess
ReadProcessMemory = windll.kernel32.ReadProcessMemory
CloseHandle = windll.kernel32.CloseHandle
PROCESS_ALL_ACCESS = 0x1F0FFF #I'll try to do minimum permissions later.
pid = 3112 #Don't worry about this, I know it's right.
address = 0x2411918 #This too.
buffer = c_char_p(b"The data goes here") #Maybe I should be using something else?
bufferSize = len(buffer.value)
bytesRead = c_ulong(0)
processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
if ReadProcessMemory(processHandle, address, buffer, bufferSize, byref(bytesRead)):
print("Success:" + str(int.from_bytes(buffer, "little"))) #Here's the problem print line.
else:
print("Failed.")
CloseHandle(processHandle)