Как создать буфер int в Python с помощью ctypes - PullRequest
1 голос
/ 09 июня 2019

Я пытаюсь записать в память на python. Мне нужно написать Integer, но для функции WriteProcessMemory мне нужен буфер.

writeProcessMemory = kernel.WriteProcessMemory
writeProcessMemory.argtypes = [ctypes.wintypes.HANDLE, 
ctypes.wintypes.LPVOID, ctypes.wintypes.LPCVOID, ctypes.c_size_t, 
                         ctypes.POINTER(ctypes.c_size_t)]
writeProcessMemory.restype = ctypes.wintypes.BOOL


openProcess = kernel.OpenProcess
openProcess.argtypes = [ctypes.wintypes.DWORD, ctypes.wintypes.BOOL, 
ctypes.wintypes.DWORD]
openProcess.restype = ctypes.wintypes.HANDLE

handle = openProcess(PROCESS_ALL_ACCESS, False, pid)
addr = 0x024EA498
data = ctypes.c_int(1000)
buffer = #i need to create a buffer here

1 Ответ

1 голос
/ 10 июня 2019

вы можете использовать create_string_buffer

buffer = ctypes.create_string_buffer(b"",1000 * 4)

для создания 0-заполненного буфера из 1000 целых чисел 4-размера. Этот буфер имеет тип ctypes.c_char_Array_4000, который может быть передан как указатель для записи в импортируемые функции.

Эта функция создает изменяемый символьный буфер. Возвращаемый объект является массивом ctypes c_char.

init_or_size должен быть целым числом, которое определяет размер массива, или байтовым объектом, который будет использоваться для инициализации элементов массива.

Если в качестве первого аргумента указан объект байтов, буфер становится на один элемент больше своей длины, так что последний элемент в массиве является символом завершения NUL. В качестве второго аргумента может быть передано целое число, которое позволяет указать размер массива, если длина байтов не должна использоваться.

Теперь вызовите вашу импортированную функцию и получите объект python bytes, только что написанный с помощью:

python_bytes_array = ctypes.string_at(buffer)

и используйте struct, чтобы получить целочисленные значения. Не нужно указывать порядковый номер. I составляет 4 байта. Это будет работать, если вызываемые функции используют 4-байтовые целые числа:

import struct
integer_tuple = struct.unpack("1000I",python_bytes_array)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...