Python - ctypes.c_char.from_buffer против ctypes.c_void_p (строка) - PullRequest
0 голосов
/ 30 мая 2018

Какая разница между:

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 (строка)

1 Ответ

0 голосов
/ 04 июня 2018

После многих тестов можно сделать вывод, что

First:

ctypes.c_char.from_buffer(string)

не будет работать, потому что метод from_buffer принимает param, который является массивом байтов, поэтому я хотел бынеобходимо сначала преобразовать строку в массив байтов, например:

buf = bytearray(string)
ptr = ctypes.c_char.from_buffer(string)

, теперь оба возвращают результаты:

ctypes.c_char_p(string)

и

ctypes.c_char.from_buffer(buf)

можно использовать при вызовах функций копирования в память, например:

ctypes.memmove for linux 

и

RtlMemoryMove for windows 
...