How to dereference a memory location from python ctypes?

21,283

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 0x1005983b0>
>>> ctypes.cast(4300833936, c_long_p).contents
c_long(42)
Share:
21,283
Admin
Author by

Admin

Updated on October 13, 2020

Comments

  • Admin
    Admin over 3 years

    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 "<stdin>", line 1, in <module>
      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)