我想把address1
的值写入number1
,它是一个整数。我试图使用addressof
,但仍然不起作用。c++中的&
的等价物是什么?在
windll.kernel32.WriteProcessMemory.argtypes = [c_void_p, c_void_p, c_char_p, c_int, c_void_p]
windll.kernel32.WriteProcessMemory.restype = c_void_p
address1 = 0xa9a010
number1 = 0x140000000
lpNumberOfBytesWritten = c_size_t(0)
if windll.kernel32.WriteProcessMemory(
hProcess,
c_char_p(address1),
addressof(c_char_p(number1)),
sizeof(c_void_p),
byref(lpNumberOfBytesWritten)) == 0:
error()
所需的输出是*address1=0x140000000,但它包含其他值
首先,
sizeof(c_void_p) = 4;
因为
0x140000000
超过四个字节,它将被截断。在您可以看到,在相同的环境下,}的结果是相同的。在
0x40000000
和{您需要将
sizeof(c_void_p)
更改为sizeof(c_longlong)
其次,根据WriteProcessMemory的功能原型
您可以看到
lpBuffer
的类型是VOID*
所以您需要将
windll.kernel32.WriteProcessMemory.argtypes = [c_void_p, c_void_p, c_char_p, c_int, c_void_p]
更改为windll.kernel32.WriteProcessMemory.argtypes = [c_void_p, c_void_p, c_void_p, c_int, c_void_p]
最后,这是修改后的代码。
^{pr2}$注意:在
hProcess
检查* address1
时,还应注意类型,并使用长类型来检查address1
。在清单[Python 3.Docs]: ctypes - A foreign function library for Python。在
有很多问题(除了缺少一些信息的问题):
当使用ctypes函数(例如
ctypes.addressof
)时,应该考虑它们对ctypes(而不是Python)类型进行操作。因此,number必须转换为ctypes类型(应该适合其值)。从指针的值创建指针会导致灾难通常,导入当前名称空间中的所有内容不是一个好主意([SO]: What is the reason for using a wildcard import? (@CristiFati's answer))
您的[MS.Docs]: WriteProcessMemory function定义有点错误(不重要),但最好使用现有别名(为了可读性起见)
这是一个工作变体。在
代码00.py:
输出:
注意事项:
相关问题 更多 >
编程相关推荐