Проблема с работой в потоке созданном через NtCreateThread

Тема в разделе "WASM.WIN32", создана пользователем slesh, 2 сен 2010.

  1. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Создаю из KernelMode юзермодный поток в определенном процессе. Создается поток удачно, код нормально исполняется но появляются какие-то странные ограничения. А именно:
    1) в таком потоке нельзя выполнить WinExec. т.е. возвращает код 0 и GetLastError = 1: Incorrect function
    2) В таком потоке нельзя создать еще один поток. т.е. CreateThread возвращает код 0 и GetLastError = 8: Not enough storage is available to process this command.
    3) При этом некоторые функции тоже выдают ошибки. Но MessageBox нормально отображается

    При создании потока настраиваю только контекст(юзермодная часть АП процесса SYSTEM) и стек (юзермодная часть АП процесса в котором запускаю поток).
    т.е. Уведомление csrss не делаю. Может быть в этом ошибка или всё же баг где-то в другом месте? Или хотя бы можно как-то из такого потока запустить другой поток в котором всё будет нормально?
     
  2. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    в этом и ошибка.

    Перехватите в нужном процессе любую часто вызываемую функцию и в ее обработчике сделайте стандартный CreateThread.
    Это проверенный рабочий способ, без головняка.
     
  3. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    2 ziral2088 в том то и дело, что уже ранее писал код который патчит таблици импорта определенного процесса (патчит самую часто вызываемую функцию) и тем самым запускает шелкод в юзермоде, который организует всю работу. Но метод чуть не нравится потому что не дает универсального внедрения в любые процессы.

    Трассировал работу CreateThread запущенно в моем потоке, он успешно запускает поток (новый поток появляется в остановленном состоянии). Далее видно что пошел запрос CsrClientCallServer, он вызвал NtRequestWaitReplyPort и тот вернул C00000AF - STATUS_ILLEGAL_FUNCTION.

    тогда вопрос: Как из ядра уведомить csrss о созданном потоке (скорее всего через NtRequestWaitReplyPort, но как - хз)? Или это зависит от версии винды?
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    почитайте статьи про csrss в этом блоге:
    http://j00ru.vexillium.org/
    и интересное чтиво и ответ на ваш вопрос там найдете...
     
  5. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    Почти все процессы юзают АПИ функции. Тот же csrss.exe(притом очень очень часто). Инжектишься в csrss и из csrss делаешь CreateRemoteThread в нужный процесс.
    Rel
    спасибо за линк, интересный блог. :)
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    В данном случае мод значения не имеет, сервис одинаков в обоих модах. Перенесу топик в WIN32(так как вы должны вначале освоить теже сервисы в юзермоде).

    slesh
    Создание процессов, потоков, загрузка длл и прочие вещи из ядра требуют часто виньапишную реализацию. Это различные нотификации, контексты активации и пр. Придётся переписывать полностью пользовательский код, что очень сложно, учитывая разные реализации в версиях системы.

    Нормально такие задачи решаются соответствующей реализацией в юзермоде, причём базовой задачей становится передача управления на целевой код из ядра. Для этого нужен пользовательский поток. Из ядра выполняется их енум и захват контекста(это манипуляции трап-фреймом, апк, калбэки шадова и пр.).