Доброго времени суток Задача состоит в том, что бы вручную создать стэк и контекст потока и передать их в NtCreateThead. На пути ее выполнения, столкнулся с вопросом: как можно получить адрес BaseThreadStartThunk в Kernel32 для того, что бы передать его свежему потоку? GetProcAddress возвращает ноль, а значит, я так понимаю, функция не экспортируемая? Ковыряя дизассемблером IDA kernel32.dll от Windows XP, я, видимо, нашел ее: в CreateRemoteThread в элемент EIP структуры контекста вносится адрес функции, выполняющей push eax и push ebx и вызов следующей функции (BaseThreadStart, как я понимаю) - судя по исходникам винды, это она и есть. Однако, и в XPшной kernel32.dll GetProcAddress тоже не помогает. Подскажите, каким образом можно найти эту функцию? Вполне возможно что я не учел чего-то элементарного, все-таки работаю с Windows не так давно
конкретно по сформулированной задаче - поиск BaseThreadStartThunk проходите по CreateFiberEx дизасмом длин инструкций 2ой е8 (call) - это есть call BaseCreateStack забираете адрес, для хп сп3. если же это искусственно выдуманная проблема, то на форуме множество веток такого типа: https://wasm.ru/forum/viewtopic.php?id=21959
BaseThreadStart можно получить по ZwQueryInformationThread Win32ThreadStart чето такое, там будет либо BaseThreadStart для потока либо BaseProcessStart для первого потока в процессе (т.е. создаете поток и в нем опрашиваете)
Почему для этого не достаточно высокоуровневых обёрток, типо CreateThread() ? Необходимо получить управление на стабе, для изменения его аргументов. Это например установка отладочного порта(тоесть в NtCreateProcess необходимо передать описатель порта исключений, но CreateProcess() не содержит данного аргумента, посему а). Морфим и зменяем стаб. б) Релоцируем модуль на другие адреса и изменяем стаб. в) Трассируем до стаба. г) Ставим HW на стаб). Про морфинг молчу.., более простой путь - мапим kernel32 на другой адрес и изменяем там стаб(следует помнить что ось не даёт релоцировать kernel32 и user32, эту проверку следует обойти, на крабе был семпл. Это статика. Динамически - трассируем апи до стаба или ставим хардварный брейк на стаб. Быстрее и надёжнее HW. При трейсе могут быть дедлоки и тп.