This library provides real pointers (as in languages like C) and some memory access utilites.
pip install pyptrs
You should never create pointers directly. Instead, use the functions below:
pyptrs.pointer_to_object(obj, c_object = False)
Return a pointer to obj. c_object specifies whether to treat the obj as a python object or a C object. If c_object is True, obj must be an instance of a ctypes C data type. You can learn more information about these data types from here, here and here
pyptrs.pointer_to_address(address, ctype = None)
Return a pointer that points to the given address. If ctype is None, a python object is assumed to be living in that address. Otherwise, ctype must be the ctypes C data type corresponding to the type of the object living in address. You can learn more information about these data types from here, here and here
Pointer.get_size()
Return the number of bytes occupied by the pointed object in memory.
Pointer.get_mem()
Return a bytes object representing the pointed object.
Pointer.temp_value(value, force_write = False)
Return a context manager that dereferences and assigns value to the pointed object at __enter__ and reverts this assignment at __exit__. If size of value is bigger than the pointed object, a MemoryError will be raised. In order to prevent this, pass True to force_write.
pyptrs.dereference(pointer, *value, force_write = False)
If value is not given, it just dereferences the pointer. If value is given, it must be a single argument and it dereferences the pointed object and assigns value to it then returns a backup_id that can be passed to pyptrs.mem_restore(). If size of value is bigger than the pointed object, a MemoryError will be raised. In order to prevent this, pass True to force_write. Type of value can be anything if the pointed object is a python object. If the type of the pointed object is a C type, type of value must be the corresponding ctypes C data type.
pyptrs.address_of(obj, c_object = False)
Return address of the obj. If c_object is True type of obj must be a ctypes C data type. You can learn more information about these data types from here, here and here. If c_object is True, address of the actual C object is returned, not the address of its ctypes wrapper.
pyptrs.mem_read(address, amount = 1)
Read amount bytes starting from address and return them as a bytes object.
pyptrs.mem_write(address, data = b"")
Write the bytes represented by data to address and return a backup_id that can be passed to pyptrs.mem_restore().
pyptrs.mem_restore(backup_id)
Revert the changes done to memory by the function that returned backup_id.
pyptrs.mem_restore_last()
Revert the last change done to memory either by pyptrs.dereference() or pyptrs.mem_write().