Python – преобразование байтового адреса (из ReadProcessMemory) в строку?

Обновление 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)

person golmschenk    schedule 30.10.2013    source источник


Ответы (2)


Оказывается, моя проблема была связана с представлением ctypes. Если я использую memmove для перемещения, чтобы переместить c_char_p в c_int, то я получаю правильные результаты. Это можно увидеть в завершенном коде ниже.

from ctypes import *
from ctypes.wintypes import *
import struct

OpenProcess = windll.kernel32.OpenProcess
ReadProcessMemory = windll.kernel32.ReadProcessMemory
CloseHandle = windll.kernel32.CloseHandle

PROCESS_ALL_ACCESS = 0x1F0FFF

pid = 3112
address = 0x2411918

buffer = c_char_p(b"The data goes here")
val = c_int()
bufferSize = len(buffer.value)
bytesRead = c_ulong(0)

processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
if ReadProcessMemory(processHandle, address, buffer, bufferSize, byref(bytesRead)):
    memmove(ctypes.byref(val), buffer, ctypes.sizeof(val))
    print("Success:" + str(val.value))
else:
    print("Failed.")

CloseHandle(processHandle)
person golmschenk    schedule 30.10.2013

person    schedule
comment
Похоже, это шаг в правильном направлении. Используя buffer.value.decode(), я просто получаю (#. Теперь мне просто нужно выяснить, как преобразовать это в 9000, которое я ищу... - person golmschenk; 30.10.2013
comment
Когда я меняю значение на 2000 (используя Cheat Engine), то ошибки декодирования с UnicodeDecodeError: 'utf-8' can't decode byte 0xd0 in position 0: invalid continuation byte. Я предполагаю, что мне просто нужна другая расшифровка? Есть предложения, какой? - person golmschenk; 30.10.2013