Привет.Подскажите плиз-вот есть на рутките такая статья https://www.rootkit.com/newsread.php?newsid=715 Однако там записывается шелкод в память. Подскажите плиз,как можно через QueueUserAPC загрузить длл в процесс 1. без шелкода. 2.В уже запущенный процесс (по ссылке в запускаемый) Возможно ли это? Т.е хочется обойти глюкавый метод Рихтера через запуск удаленного потока.Все твердят об QueueUserAPC,однако примера нигде не видел,кроме приведденого..
В теории все просто. Ищешь описатель процесса, открываешь его, перечисляешь потоки, посылаешь апц, одному из потоку (а лучше всем сразу). Тока есть заморочки с Alertable состоянием потока и еще с ядерной переменной потока (в KTHREAD) UserApcPending Про это можно почитать тут: http://www.ddj.com/windows/184416590;jsessionid=NA2WVOAB01OLAQSNDLRCKHSCJUNN2JVN?pgno=1
Плохой способ, даже вообже не применимый. Поток может находится в состоянии ожидания с запретом на обработку очереди потока. Точка обработчика APC таже что и нового потока - KiUserApcDispatcher. Возникнут проблемы с синхронизацией. Да темболее внедрять модуль! Наилучший способ - перехват через механизм исключений или хуком выхода из сервиса(KiFastSystemCallRet). Исходники давно выложены.
Clerk Не будет никаких проблем. Ибо модуль загружается 1 раз. Остальные вызовы пройдут в фалиед - ничего страшного. Если ты видишь там проблемы - обоснуй их конкретно. Я реализовывал такое и могу сказать на 100 процентов что он рабочий (по крайней мере в моей реализации) И в 64 битной винде.
Э..Сорри..Я вообще из юзермоде собираюсь все это делать.. немного не понял.Где можно прочитать и юзер ли моде это? Что-то везде куча исходников,однако проблема инжекта (нормального и рабочего из юзермоде) все еще остается актуальной,судя по вопросам на форуме...
coocky Я тебе про юзермод говорил, в плане теории. А про ядро - это тебе для общего развития. Я просто в ядре исследовал механизмы и реализовывал.
без шеллкода - добавляй АПЦ с адресом LoadLibraryA и с адресом строки как аргументом в запущеный процесс - у процесса должны быть потоки, ожидающие в alertable состоянии. Либо когда перейдут - выполнится АПЦ. Ссылку уже дали адрес обработчика APC хендл открытого с правами THREAD_SET_CONTEXT потока аргумент, который будет передан обработчику а вообще это обертка для NtQueueApcThread http://msdn2.microsoft.com/en-us/library/ms684954(VS.85).aspx
Смотри в мсдн есть описание этой функции Просто надо тебе открыть процесс на полный доступ и открыть описатель его потока (допустим тот который в состоянии Running)
JamesB Таких потоков может не быть вовсе. Это исключение чем правило.) Так что тут прийдется подумать как из юзермода перевести его в алертейбл (смотри неббета NtAlertThread, копай туда)
JamesB А процесс открывать чтоб получить доступ к его потокам. Хотя может хватит только полученного хендла. Но возможно не хватит прав.. Не пробовал так
Ясное дело, и очень редко, когда есть такие потоки (алертейбл), но у explorer'а хотя бы 1 такой поток всегда есть по-любому) А вот перевести поток в алертейбл - насколько я знаю невозможно вообще. NtAlertThread ничего не делает почему-то. Где почитать?) нужен только хендл потока, открытого с правами THREAD_SET_CONTEXT и всё... что бы перечислять потоки процесс открывать не нужно
JamesB спасибо,я все найду и QueueUserAPC я юзаю у себя в прогах частенько. Там три параметра-APCProc-которая должна быть поставлена в очередь,хендл потока,в очередь которого должна быть поставлена APCProc и указатель на дополнительные параметры. Я так понял первый параметр адрес LoadLibrary,второй хендл потока, третий-аргумент для LoadLibrary?
JamesB Не делает потому надо делать SleepEx(..., Alertable) А в чужом потоке такого нет. И апц прийдет только когда из кернела установить UserApcPending . При чем KiInsertQueueApc (если я не ошибаюсь) Ставит его по дефолту этот pending если поток = Alertable)
Э!!! Мужики,вы про меня забыли совсем.Я потерялся в ваших спорах! ))) Ище подскажи те все же правильный подход (или попробую все варианты) Какой хендл потока мен передавать во второй аргумент? Где ,а главное как правильно его получить? Имеет ли значение-процесс запускаемый или уже запущеный? В чем будет заключаться разница подходов? Согласен на ссылки и схематическое обьяснение (код не прошу ) Только плиз,без особого сленга
TermoSINteZ, Дык само собой) Я про то и говорю, что никак не заставишь поток стать алертным, пока он сам не захочет. Имеется ввиду конечно, такими средствами, которые менее "палевны" для современных проактивных защит, чем сама NtQueueApcThread ... т.е. про ядро и инжект можно не говорить да... у меня где-то есть кодес, где делается так (разумеется, из ядра) PETHREAD Thread; Thread->Tcb.Alertable = TRUE; Thread->Tcb.ApcState.KernelApcPending = TRUE; Thread->Tcb.ApcState.UserApcPending = TRUE; перечисляешь все потоки, принадлежащие процессу, в который будешь "это делать" каждый открываешь с правами THREAD_SET_CONTEXT и хендл передаешь вторым параметром... куда уж подробнее?) перечислить можно через toolhelp api (Thread32First,Thread32Next), а можно сразу через NtQuerySystemInformation
Все.Сэнкс! Просто в ходе дискусии я потерялся. А насчет запущеного процесса и запускаемого-нет разницы? И это,ваши дискуссии про Alertable_ность тоже можно пропустить?
coocky Короче в двух словах. есть три состояния - Alertable, Alerted, UserApcPending Функции делающие Alert - они просто устанавливают или проверяют состояние Alerted а Alertable может устанавливать тока поток сам (тот же SleepEx()) ну либо из кернела. А так же есть UserApcPending - она непосредственно влияет на апц. Если у потока оно не установлено - то пофиг на все остальные флаги - апц не обработается. Хендл потока (любого запущеного, при этот проверив находится ли он в состоянии Алертейбле). Иначе бессмысленно слать