Создаю из 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 не делаю. Может быть в этом ошибка или всё же баг где-то в другом месте? Или хотя бы можно как-то из такого потока запустить другой поток в котором всё будет нормально?
в этом и ошибка. Перехватите в нужном процессе любую часто вызываемую функцию и в ее обработчике сделайте стандартный CreateThread. Это проверенный рабочий способ, без головняка.
2 ziral2088 в том то и дело, что уже ранее писал код который патчит таблици импорта определенного процесса (патчит самую часто вызываемую функцию) и тем самым запускает шелкод в юзермоде, который организует всю работу. Но метод чуть не нравится потому что не дает универсального внедрения в любые процессы. Трассировал работу CreateThread запущенно в моем потоке, он успешно запускает поток (новый поток появляется в остановленном состоянии). Далее видно что пошел запрос CsrClientCallServer, он вызвал NtRequestWaitReplyPort и тот вернул C00000AF - STATUS_ILLEGAL_FUNCTION. тогда вопрос: Как из ядра уведомить csrss о созданном потоке (скорее всего через NtRequestWaitReplyPort, но как - хз)? Или это зависит от версии винды?
почитайте статьи про csrss в этом блоге: http://j00ru.vexillium.org/ и интересное чтиво и ответ на ваш вопрос там найдете...
Почти все процессы юзают АПИ функции. Тот же csrss.exe(притом очень очень часто). Инжектишься в csrss и из csrss делаешь CreateRemoteThread в нужный процесс. Rel спасибо за линк, интересный блог.
В данном случае мод значения не имеет, сервис одинаков в обоих модах. Перенесу топик в WIN32(так как вы должны вначале освоить теже сервисы в юзермоде). slesh Создание процессов, потоков, загрузка длл и прочие вещи из ядра требуют часто виньапишную реализацию. Это различные нотификации, контексты активации и пр. Придётся переписывать полностью пользовательский код, что очень сложно, учитывая разные реализации в версиях системы. Нормально такие задачи решаются соответствующей реализацией в юзермоде, причём базовой задачей становится передача управления на целевой код из ядра. Для этого нужен пользовательский поток. Из ядра выполняется их енум и захват контекста(это манипуляции трап-фреймом, апк, калбэки шадова и пр.).