在
C++
中有工作代码,并希望获得与 Python
相同的结果。
这个想法是使用特定的进程和指针从内存中检索数据。结果应如下所示,因为它在 C++ 中工作:
这是 C++ 代码:
hProcess = SOME_HANDLER
addr = SOME_POINTER
SIZE_T bytesRead = 0;
SIZE_T sizeBuff = 0x4000;
BYTE buff[sizeBuff];
ReadProcessMemory(hProcess, addr, buff, sizeBuff, &bytesRead);
在 Python 中我试过这个:
read_buffer = (ctypes.c_char * 0x4000)()
lp_buffer = ctypes.byref(read_buffer)
n_size = ctypes.sizeof(read_buffer)
lp_number_of_bytes_read = ctypes.c_ulong(0)
ctypes.windll.kernel32.ReadProcessMemory(self.handle, ctypes.c_void_p(lp_base_address), lp_buffer, n_size, lp_number_of_bytes_read)
result = read_buffer.value
这给了我这个结果:
`b'hA\xdf\x01<B\xdf\x01\xb9\t\xba\t'`
我不知道这是什么意思,也不知道它是否包含任何有用的东西。
result
是 bytes
类型的值,表示 0 到 255 之间的一系列整数值,包括 0 和 255。
当您显示时,每个字节以两种形式之一显示:
\x
为前缀的十六进制整数。迭代
bytes
值会产生一系列 int
对象:
>>> list(result)
[104, 65, 223, 1, 60, 66, 223, 1, 185, 9, 186, 9]
(注意是
ord('h') == 104
、ord('A') == 65
、\xdf == 223
等)
如评论中所述,
struct
包可用于从原始 bytes
值中提取“可用”对象。例如,可以将这 12 个字节视为大端字节顺序中的 3 个无符号 4 字节字:
>>> import struct
>>> struct.unpack(">III", result)
(1749147393, 1011015425, 3104422409)
或 6 个无符号的 2 字节小字节序字:
>>> struct.unpack("<HHHHHH", result)
(16744, 479, 16956, 479, 2489, 2490)