Многие защиты, типа антиботов и т.п. любят ставить нотификаторы на отслеживание запуска нежелательного софта. (PsSetCreateProcessNotifyRoutine) Как его можно снять "малой кровью"? Может есть готовый код у кого? Как это делает RkU в своём Normandy.sys? Есть ли у кого интерфейс к этому дрову?
o PsSetCreateProcessNotifyRoutine(@Notify, TRUE). o Обнулить PspCreateProcessNotifyRoutineCount(придётся очищать сам описатель тоже). o Удалить вручную.
Статью по вашим советам (PspCreateProcessNotifyRoutineCount) нашёл. Про сорцы - коммерческий проект был некогда было копаться. Теперь понял, благодарю.
Разрабатываю подобие антивируса на курсовую, как можно препятствовать снятию нотификаторов установленных моим ав, устанавливаю следующие нотификаторы: 1. PsSetCreateProcessNotifyRoutine 2. PsSetLoadImageNotifyRoutine
Верно, и пожалуй, это единственный человеческий способ. Я чуть больше скажу. На самом деле "снять" нотификатор можно несколькими способам, основными из которых мне видятся два: перезаписать адрес в таблице нотификаторов или просплайсить код нотификатора (например, тупо ret вставить в начало). Первый способ реально отследить только периодическим мониторингом "по таймеру". Со вторым чуть интереснее: можно перехватить и обрабатывать специальным образом #PF, но в общем и целом этот способ нетривиален для новичков.
x64 Это технологии из области IDP, не доступные простым смертным(ведь патчи использовать и изменять IDT нельзя) JCronuz Никак в общем случае, если не известен механизм их снятия.
Clerk- Если можно, может статью напишите. "Простым смертным"? x64, -Я именно так и сделал сплайсом (заморачиваться с таймерами и т.п не нужно) #4 (PsSetCreateProcessNotifyRoutine что собственно и интересовало меня, ADD: в принципе и "нехороший" драйвер можно было пропатчить... если кому надо пишите в ЛС как я Frost и GameShield ломанул - м.б. расскажу )
по таймеру предлагали проверять не только нахождение вашего нотификатора в списке, но и ваш сплайс (вдруг его сняли?). Вообще посоветую вам не использовать сплайсинг в ядре, т.к. это чревато последствиями.
Нотификатор на запуск приложения не только защитами может использоваться. Глобально его убивать не стоит. Могу предложить такую идею. 1. Установить свой нотификатор. Надо это сделать раньше остальных. 2. Когда будет вызван нотифай, надо определить - пропускать дальше или нет. 3. Если дальше не пропускаем, то начинаем раскручивать стек, пытаясь добраться до кода который последовательно вызывает все нотификаторы (это один или 2 уровня вверх) 4. Пользуясь таблицей смещений, которую заранее вычислили для всех OS. Изменяем счётчик цикла так, чтобы итерация вызова нашего нотифая оказалась последней. Т.е. если бы код вызывающий нотифай выглядел бы так: for(size_t i=0;i<NotifyCount;++) notify(a,b,c ...); То из первого нотифая необходимо найти адрес переменной i и сделать его равным NotifyCount или больше. Т.е. проще всего вписать туда очень большое число и не парится с поиском значения NotifyCount. Если бы код менялся часто, то смещений было бы очень много и была бы большая проблема их всех найти. Но я думаю конкретно этот кусок кода не менялся и смещение будет одно для всех OS.
RET Почитал последнюю вашу тему в блоге, хотел отписать но для этого нужно регаться, а мне лень. Напишу здесь. Сабж: Патч в любой форме считается отсталым и не приемлимым способом. Необходимо зарегать багчек-нотифи стандартными средствами(док. KeRegisterBugCheckCallback()) и откатывать фолт из него.
Clerk Это из моего блога цитата, про патч это не ко мне, а к разработчикам данных перехватов. Я лишь описал баг ( хотя это и баян столетний ).