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
等。
答案 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