MegaZu Я образно сказал, но вероятность вылета велика в ядре, особенно если заезженные ф-и перехватывать. Лучше делать перехват ч-з СДТ, тут некорректно поставить его невозможно, да и в очередь все перехваты выстраиваются, сколько б их не было v0s Почему бы не почитать ms-rema, у него все подробно написано по перехватам, там же он и высказывает свое мненме насчет сплайсинга в ядре, с которым я согласен полностью (проверено на деле). Есть также куча сайтов по этой тематике, готовые руткиты можно найти на www.rootkit.com
Сплайсинг в ядре можно сделать безопасным образом. Допустим перехватываемая функция вызывается на DISPATCH_LEVEL, в этом случае надо послать DPC на все процессоры в системе и зациклить их там на время установки перехвата. В этом случае можно гарантировать, что никакой поток не обратиться к недопатченой функции. Надежный сплайсинг функций вызывающихся на PASSIVE_LEVEL сделать сложнее, так как ее исполнение может быть прервано в самом начале, но проблема решается добавлением проверки контекста потоков.
Ms Rem добавлением проверки контекста потоков. В смысле по eip определяем, в user страницах мы или нет? Если нет - то мы в режиме ядра?
По eip определяем, не остановлен ли поток на опасном учстке (который будет сплайситься). Если такой поток обнаружен, то надо подождать некоторое время и попробовать снова.
Corleone Да, это надежно просто и понятно, но хотелось бы исследовать и другие методы Ms Rem Ага, как раз это и нужно - ведь системные сервисы можно вызывать только с IRQL == PASSIVE_LEVEL? А как это определить разъясни plz.
Берешь, вичисляешь адрес перехвата, и смотришь не лежит ли eip в момент остановки потока в области затирания
А зачем его узнавать? Перед тем как устанавливать перехват надо просто заблокировать все побочные процессоры через DPC и поднять свой IRQL до DISPATCH_LEVEL. При этом все другие потоки будут остановлены.
A что, если сплайсеть один неиспользуемый/малоиспользуемый сервис. а потом брать заглушки и ставить там вместо mov eax,nomer_syscall mov eax,nomer_novogo_maloispolzuemogo тогда патчить надо один дворд всего.