Поиск BaseThreadStartThunk

Тема в разделе "WASM.NT.KERNEL", создана пользователем PotapovPV, 6 апр 2011.

  1. PotapovPV

    PotapovPV New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2011
    Сообщения:
    12
    Доброго времени суток
    Задача состоит в том, что бы вручную создать стэк и контекст потока и передать их в NtCreateThead.
    На пути ее выполнения, столкнулся с вопросом: как можно получить адрес BaseThreadStartThunk в Kernel32 для того, что бы передать его свежему потоку?
    GetProcAddress возвращает ноль, а значит, я так понимаю, функция не экспортируемая?
    Ковыряя дизассемблером IDA kernel32.dll от Windows XP, я, видимо, нашел ее: в CreateRemoteThread в элемент EIP структуры контекста вносится адрес функции, выполняющей push eax и push ebx и вызов следующей функции (BaseThreadStart, как я понимаю) - судя по исходникам винды, это она и есть. Однако, и в XPшной kernel32.dll GetProcAddress тоже не помогает.
    Подскажите, каким образом можно найти эту функцию?
    Вполне возможно что я не учел чего-то элементарного, все-таки работаю с Windows не так давно
     
  2. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    конкретно по сформулированной задаче - поиск BaseThreadStartThunk проходите по CreateFiberEx дизасмом длин инструкций 2ой е8 (call) - это есть call BaseCreateStack забираете адрес, для хп сп3.

    если же это искусственно выдуманная проблема, то на форуме множество веток такого типа:
    https://wasm.ru/forum/viewtopic.php?id=21959
     
  3. Babyshamble

    Babyshamble New Member

    Публикаций:
    0
    Регистрация:
    2 май 2010
    Сообщения:
    67
    BaseThreadStart можно получить по ZwQueryInformationThread Win32ThreadStart чето такое, там будет либо BaseThreadStart для потока либо BaseProcessStart для первого потока в процессе (т.е. создаете поток и в нем опрашиваете)
     
  4. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Почему для этого не достаточно высокоуровневых обёрток, типо CreateThread() ?
    Необходимо получить управление на стабе, для изменения его аргументов. Это например установка отладочного порта(тоесть в NtCreateProcess необходимо передать описатель порта исключений, но CreateProcess() не содержит данного аргумента, посему а). Морфим и зменяем стаб. б) Релоцируем модуль на другие адреса и изменяем стаб. в) Трассируем до стаба. г) Ставим HW на стаб). Про морфинг молчу.., более простой путь - мапим kernel32 на другой адрес и изменяем там стаб(следует помнить что ось не даёт релоцировать kernel32 и user32, эту проверку следует обойти, на крабе был семпл. Это статика. Динамически - трассируем апи до стаба или ставим хардварный брейк на стаб. Быстрее и надёжнее HW. При трейсе могут быть дедлоки и тп.