Python在取消引用外部ctypes指针时崩溃
我正在windows中玩Python在取消引用外部ctypes指针时崩溃,python,windows,ctypes,Python,Windows,Ctypes,我正在windows中玩ctypes和ReadProcessMemory 我希望能够读取一块内存并将其转换为ctypes类型,然后访问正确的值 当前,当取消引用指针时,此操作失败。这是一个简单的例子: # a minimal example from ctypes import * import win32api class Test(Structure): _fields_ = [ ('p', POINTER(c_int)), ('pp', POINT
ctypes
和ReadProcessMemory
我希望能够读取一块内存并将其转换为ctypes类型,然后访问正确的值
当前,当取消引用指针时,此操作失败。这是一个简单的例子:
# a minimal example
from ctypes import *
import win32api
class Test(Structure):
_fields_ = [
('p', POINTER(c_int)),
('pp', POINTER(POINTER(c_int)))
]
rpm = windll.kernel32.ReadProcessMemory
PROCESS_ALL_ACCESS = 0x1F0FFF
pid = 10520
addr = 0x409E4260
process = win32api.OpenProcess(PROCESS_ALL_ACCESS, 0, pid)
size = sizeof(Test)
buff = create_string_buffer(size)
bytes_read = c_size_t()
success = rpm(
process.handle,
addr, # where to read from
buff, # output
size, # how much to read
byref(bytes_read)
)
if not success:
print " Error reading memory: " + str(get_last_error())
else:
test = cast(buff, POINTER(Test)).contents
print test
# access pointers
print test.p
print test.pp
# dereference pointers
print test.p.contents
print test.pp.contents
最后两行使python崩溃,我认为是因为它试图访问另一个进程的内存。(?)
我已经编写了一个递归函数,它可以通过反复调用ReadProcessMemory来取消对指针的引用,但是这对于复杂的结构来说是笨拙的
我做错了什么?执行此操作的最佳方法是什么?取消指针引用会尝试访问进程地址空间中的地址。它崩溃是因为那里什么都没有;这是一个未映射的地址。@eryksun啊!这是有道理的。有没有一种好方法可以覆盖默认的取消引用操作,使其在外部内存中显示?您是否找到了解决方案?“我想我也有同样的问题。”@adamb那是很久以前的事了,所以我记不得了。我刚刚查看了我的代码,似乎已经在
cast
ing之后将.process
属性设置为外部进程。在本例中,它将是test.process=process
。