Python ctypes.create_string_buffer问题

时间:2010-10-29 23:56:35

标签: python ctypes

kernel32.dll的ReadProcessMemory函数似乎正在返回Unicode。

kernel32 = ctypes.windll.kernel32
PROCESS_QUERY_INFORMATION = 0x0400
PROCESS_VM_READ = 0x0010

pid = int(raw_input("Enter PID: "))
hproc = kernel32.OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_READ, False, pid)
lpbaseaddr = 16799644
read_buff = ctypes.create_string_buffer(4)
bytread = ctypes.c_ulong(0)
kernel32.ReadProcessMemory(hproc, lpbaseaddr, read_buff,
                               4, ctypes.byref(bytread))
print read_buff.raw #i also tried read_buff.value

我知道该地址的值是80,因为我使用了作弊引擎使其成为80. print read_buff行返回 P。如果我使用作弊引擎创建该地址81的值并运行我的程序,则返回值Q。我一直在搞乱,unichr(80)返回Punichr(81)返回Qcreate_string_buff显然存在问题。我应该使用字节缓冲区还是整数缓冲区,我该怎么做?使用unichr()适用于一些值,但说地址值为800unichr(800)显然不起作用。我正在寻找read_buff来返回5060800等。

1 个答案:

答案 0 :(得分:5)

它不返回Unicode,而是返回四个字节作为字符串(可能是'\ x80 \ x00 \ x00 \ x00')将指针传递给整数而不是字符串缓冲区:

read_buff = ctypes.c_uint()
kernel32.ReadProcessMemory(hproc, lpbaseaddr, ctypes.byref(read_buff),
                           ctypes.sizeof(read_buff), ctypes.byref(bytread))
print read_buff.value