1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Как перехватывать вызовы апи в ядре?

Тема в разделе "WASM.NT.KERNEL", создана пользователем M0rg0t, 6 сен 2020.

  1. M0rg0t

    M0rg0t Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    944
    Собственно, сабж. Где можно прочитать актуальную инфу на тему как работает перехват в ring0 ? В юзермоде как - я понимаю, а как там? Вроде как все драйвера работают в контексте 1 процесса, поэтому не надо никуда инжектится, но что дальше? И может ли авер (к примеру) перехватить все вызовы и не давать изменить эти перехваты?

    Вообще, используется ли "обычный" (как в юзермоде, хотпатч), или в ядре сейчас используются только "минифильтры" и прочие стандартные возможности ?

    Сорцы на гитхабе видел, но не хватает знаний, чтоб понять.
     
  2. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    844
    Адрес:
    Россия, Нижний Новгород
    Перехваты работают так же, как в юзермоде, только с небольшими корректировками.
    Так как в ядре нет аналога VirtualProtect для ядерной памяти, создаётся Writeable-отображение нужной страницы и туда ставится патч (джамп на обработчик).
    Другой вариант - перехватывать системные сервисы в таблицах SSDT: требуется лишь подменить в них указатель на обработчик.

    Но в ядре работает PatchGuard - механизм, отслеживающий модификацию критичных данных и кода.
    Он периодически проверяет целостность ядра и, если увидит твои патчи, свалит систему в синий экран с ошибкой CRITICAL_STRUCTURE_CORRUPTION.

    Например, у меня в кб встроена хуклиба в сам драйвер и из коробки позволяет перехватывать любые функции ядра.
    А чтобы PatchGuard не нашёл изменений, можно скрыть патч гипервизором, отдавая на чтение страницу без патча, а на исполнение - с патчем.

    А для каких-то операций удобнее работать не с хуками, а с фильтрами-каллбэками.
    Например, для фильтрации файлов используются минифильтры, для обработки открытий\дупликаций хэндлов - ObRegisterCallbacks, для отслеживания создания процессов и потоков - Ps-каллбэки.
     
    M0rg0t нравится это.
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    3.385
    Ты как то поздновато решил руткит писать, патчгарды всякие, блокировка загрузки неподписанных драйверов.
     
  4. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    844
    Адрес:
    Россия, Нижний Новгород
    Только если работает в связке с гипервизором.
    Без него перехватить ничего нельзя, т.к. на патчи будет триггериться PatchGuard - система не проработает и десяти минут.
    Кроме того, без гипервизора нельзя отслеживать записи в страницу: соответственно, перехваты антивируса может снять кто угодно.
    --- Сообщение объединено, 6 сен 2020 ---
    Не слишком актуально: есть много уязвимых подписанных драйверов от крупных вендоров, через которые можно самому залезть в ядро, а также, слитые EV-сертификаты.
     
  5. M0rg0t

    M0rg0t Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    944
    Rel, мне в целом интересно, раньше даже не смотрел в сторону ядра, а сейчас как то хочется понять, как устроено все на низком уровне. Те же аверы и подобное. А руткит хз, думал написать защитное решение против шифровальщиков, но так, на уровне РоС и для обучения. Не понимаю, почему аверы их не заблочат раз и навсегда, в теории это можно сделать.

    HoShiMin, спасибо. А PatchGuard это только для 64 битных ОС или начиная с висты? Я что-то путаюсь в этих защитных решениях. Вроде как для 32 бит не надо сертификата, по крайней мере на вин7 не надо было. Там сложно как-то в ядре. Был такой мужик с Беларуссии, сидел на старом васме и на киберфоруме, он много писал про ядро. Вот не помню эту градацию защитных решений. Впрочем, сейчас наверное везде виндовс 10, а там вроде для ядра нужна кросс подпись MS , или нет?

    А EV серты, к слову, продают на блэк форумах, по ~ 2k usd, уж не знаю где они их берут, но предложения очень много.
     
  6. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    844
    Адрес:
    Россия, Нижний Новгород
    Да, только на x64 и начиная с висты. На x32 по-прежнему можно грузиться без подписи и перехватывать что угодно.
    А на хостах с Hyper-V есть дополнительный опциональный слой защиты - HVCI/DeviceGuard, ограничивающий модификацию критичных ресурсов на уровне гипервизора.
    Например, с включенным DeviceGuard нельзя даже выделить в ядре исполняемую динамическую память, и никакие трюки с ручной модификацией PTE уже не сработают.

    Не совсем.
    Нужна, если включен SecureBoot, но если сертификат выпущен до 29 июля 2015го (и даже если просрочен), то загрузится и без неё (и даже если включен SecureBoot).
    Кроме того, подписывать драйвера можно даже обычными, не-EV-сертификатами, и получать для них кросс-подпись: https://docs.microsoft.com/en-us/wi...code-signing-policy--windows-vista-and-later-
     
    M0rg0t нравится это.