How to dereference a memory location from python ctypes?

匿名 (未验证) 提交于 2019-12-03 02:06:01

问题:

I want to replicate the following c code in python ctypes:

main() {   long *ptr = (long *)0x7fff96000000;   printf("%lx",*ptr); } 

I can figure out how to call this memory location as a function pointer but not just do a normal dereference:

from ctypes import * """ >>> fptr = CFUNCTYPE(None, None) Traceback (most recent call last):   File "", line 1, in    File "/usr/lib/python2.6/ctypes/__init__.py", line 104, in CFUNCTYPE     class CFunctionType(_CFuncPtr): TypeError: Error when calling the metaclass bases     item 1 in _argtypes_ has no from_param method """ fptr = CFUNCTYPE(None, c_void_p) #add c_void_p since you have to have an arg fptr2 = fptr(0x7fff96000000) fptr2(c_void_p(0)) #python: segfault at 7fff96000000 ip 00007fff96000000 

Since there it is a segfault with the instruction pointer pointing to this memory location it is successfully calling it. However I can't get it to just read the memory location:

ptr = POINTER(c_long) ptr2 = ptr(c_long(0x7fff96000000)) #>>> ptr2[0] #140735709970432 #>>> hex(ptr2[0]) #'0x7fff96000000' #>>> ptr2.contents #c_long(140735709970432) 

回答1:

ctypes.cast.

>>> import ctypes >>> c_long_p = ctypes.POINTER(ctypes.c_long) >>> some_long = ctypes.c_long(42) >>> ctypes.addressof(some_long) 4300833936 >>> ctypes.cast(4300833936, c_long_p) <__main__.lp_c_long object="" at=""> >>> ctypes.cast(4300833936, c_long_p).contents c_long(42) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!