我正在尝试用python写入内存。我需要写一个整数,但是对于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
答案 0 :(得分:1)
您可以使用create_string_buffer
buffer = ctypes.create_string_buffer(b"",1000 * 4)
创建一个1000个4尺寸整数的0填充缓冲区。该缓冲区的类型为ctypes.c_char_Array_4000
,可以作为指针传递以写入导入的函数。
此函数创建一个可变字符缓冲区。返回的对象是c_char的ctypes数组。
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)