Это правда, что драйвер режима ядра может делать все, что может делать ядро - в конце концов, они оба работают в кольце 0. Ключевой вопрос здесь: насколько это сложно? Исправление ошибок зависит от внутренние детали, которые могут меняться в разных выпусках ядра. Например, номер системного вызова NtTerminateProcess
будет меняться в зависимости от версии, поэтому драйвер, который перехватывает SSDT, будет прерываться между версиями (хотя номер системного вызова можно получить другими способами). Чтение или изменение полей внутренних структур, таких как EPROCESS
или ETHREAD
, также сопряжено с риском, поскольку опять-таки эти структуры меняются между версиями. Все это невозможно для водителя, но это сложно.
Если для перехвата предусмотрен официальный интерфейс, Microsoft может гарантировать совместимость между версиями, а также возможность контролировать, кто что может делать (например, только подписанные драйверы могут использовать обратные вызовы диспетчера объектов). Однако Microsoft не может сделать это для всего , потому что некоторые вещи - это просто детали реализации, о которых драйверы не должны знать.