Python ctypes.create_string_buffer 问题

3 投票
1 回答
5831 浏览
提问于 2025-04-16 06:18

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)返回P,而unichr(81)返回Q。显然,create_string_buff有问题。我应该使用字节缓冲区还是整数缓冲区呢?该怎么做?使用unichr()对一些值有效,但如果地址的值是800,那么unichr(800)显然就不行。我希望read_buff能返回5060800等等。

1 个回答

6

它并不是返回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

撰写回答