Какая разница между:
pointer = ctypes.c_char_p('abc')
и
string = 'abc'
buffer = (ctypes.c_char * len(string)).from_buffer(string)
Технически оба указателя, когда передаются в своих соответствующих вызовах функций, например: (кросс-платформенные вызовы различных функций)
if os.name == 'posix':
string = 'abc'
libc = ctypes.CDLL('libc.so.6')
# creating a pointer pointing at our string
s_ptr = ctypes.c_char_p(string)
# allocating free space
free_space_ptr = ctypes.c_void_p(libc.valloc(ctypes.c_int(len(string))))
# copying memory from one loc to another
ctypes.memmove(free_space_ptr, s_ptr, ctypes.c_int(len(string)))
else:
string = 'abc'
# allocating free space
free_space_ptr = ctypes.windll.kernel32.VirtualAlloc(...)
# creating a pointer pointing at our string?
buffer = (cytpes.c_char_p * len(string))).from_buffer(string)
# copying memory from one loc to another
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_void_p(free_space_ptr), buffer, ctypes.c_int(len(shellcode)))
Мой вопрос:
Два вызова функций (и memmove, и RtlMoveMemory) принимают два указателя ==> destination, source, а затемпоследний параметр - длина для копирования.
В чем разница между двумя способами получения указателя, указывающего на нашу строку? :
- Использование ctypes.c_char_p(строка)
против
- Использование ctypes.c_char.from_buffer (строка)