интересуют готовые рабочие примеры инжекта в юзермод .... например для запуска процесса .......................
Полуготовое есть здесь. Не понял, при чём здесь инжект и запуск процесса? Тебе нужно внедрение кода или создание процесса? Не понятно.
нужно внедрить код ... он будет работать в юзермоде ... и целью этого кода является создание процесса ... (createprocess)
Clerk привет, как передать управление стабильнее всего (без апц) на код? я подумывал перехватить что-то вроде KiFastSystemCall но жаль этой точки в 2к нету. (с учетом внедрения в запущенный процесс).
Зависит от того, откуда исполняется инжект. Если IRQL = PASSIVE_LEVEL, то просто передать управление(Iret etc.)
Clerk Если текущий поток создавался как ядерный, а ты делаешь iretd, то могут быть проблемы с TEB и прочей юзермодной ерундой, которая не заполняется для ядерных потоков. Я пробовал) Там немножко извратиться придется и в конце концов проще так не делать, как оказалось.
Great Разумеется что необходимо создать стек, TEB, инициализировать его и пр. Это проблемно сделать изза того что нужна совместимость с разными версиями. Раз APC не подходит, значит нельзя создавать поток, так как он и начинается с юзермодной апк. Всё вручную делать. На самом деле Грит прав, проще в контексте чужого потока исполниться, темболее что весь нужный функционал или экспортируется, либо весьма просто находится. Насчёт передачи управления лучше чем напрямую инструкцией Iret не придумать.
1. Запиши код вызова CreateProcess в а.п. CSRSS. 2. Создай поток в процессе CSRSS, адресом точки входа укажи код, записанный на предыдущем шаге. Если опустить детали, то это всё, что тебе нужно.
а нельзя ли возложить инжект на KeUserModeCallback ? тоесть выполнить код в контексте процесса типа систем
Этот способ имеет ещё больше ограничений, чем даже APC. Тебе оно надо? Зачем ты лезешь в такие дебри? Это может быть полезно разве что для изучения ядра, но никакой практической пользы не несёт. Когда нужно коммерческое и стабильное решение - следует брать то, что проверено и наиболее документировано. В данном случае я бы рекомендовал банальное создание потока, как я и писал чуть выше, это совсем не сложно.
qwqwqwqw http://twister.rootkits.ru/sources/ke_user_mode_callback.rar Зачем палицца, потоки создавать.. Перечисляем потоки, например PsGetNextProcessThread() чтоб вручную списки не юзать, суспендим каждый, получаем контекст, сохраняем гдето Esp(например в TEB или выделяем под талицу память), сохраняем контекст в стеке, загружаем Eip на свой код. Ждём когда код получит управление. Когда это произойдёт взводим атомарно проверяем и взводим флажёк. Если он взведён восстанавливаем контекст и возвращаемся, для того чтоб только один поток исполнил код. Никаких замут с инициализацией чеголибо, этим не спалят при проверке TID в какомнибудь модуле, сообщив что обнаружен паразитный тред.. Для процессов типа smss, в котором потоки никогда не выходят из состояния ожидания придётся использовать коннект на порт, подобное может понадобится и для csrss, дабы вывести поток из состояния ожидания.
Что ж вы всё через жопу хотите делать. Ты ж человеку реально геморрой предлагаешь. Я предлагаю простой способ, основанный практически полностью на частично документированных API ядра. А палевность... Ну конечно, если пишете малварь, то туда вам и дорога - в жопу с её геморроем, а если нормальное приложение (что-нибудь секурное, например, или прикладное, мало ли) - почему нет?