это может быть действительно простой вопрос, но почему-то я просто не могу обернуть голову вокруг ответа, и я не могу найти ни одной хорошей и связанной документации по этой теме.
Итак, я пытаюсь создать PoC с помощью модуля Python ctypes и метода CreateThread в классе ctypes.windll.kernel32 (для выполнения некоторого внедрения шелл-кода в пространстве памяти программы)
Согласно msdnдокументация CreateThread 7 параметров:
- Указатель на атрибуты безопасности
- Начальный размер стека
- Указатель на начальный адрес
- Указатель на любые параметры
- Флаг создания
- Указатель на значение, которое получает идентификатор потока
И все примеры использования python для вызова функций стиля c иlibs таковы:
thread_handle = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),
ctypes.c_int(0),
ctypes.c_int(ptr),
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.pointer(ctypes.c_int(0)))
Может кто-нибудь объяснить, почему последний параметр был использован как ctypes.pointer (c_int0), тогда как для других параметров используется значение константы другого нулевого указателя целое число 0.(например, ctypes.c_int (0))
Обновление: вот пример кода, и эту реализацию можно увидеть по всей сети:
Строка 786 из вызов функции createThread в python
Обратите внимание на приведенную выше строку скрипта с упомянутыми комментариями:
# _Out_opt_ LPDWORD lpThreadId // NULL, so the thread identifier is not returned.
Похоже, автор может ошибаться при комментированииссылка для вызова функции CreateThread.
Предположение: Согласно комментарию в упомянутом ответе Марка, ThreadID и ThreadHandle различаются, и путем передачи в ctypes.pointer (ctypes.c_int (0)) вместо простоplain ctypes.c_int (0) (NULL) означает, что в расположении int 0 будет храниться идентификатор потока.Может ли кто-нибудь подтвердить это предположение?