Python ctypes.create_string_buffer 问题
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
能返回50
、60
或800
等等。
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