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

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

  1. M0rg0t

    M0rg0t Well-Known Member

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

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

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

    HoShiMin Well-Known Member

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

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

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

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

    Rel Well-Known Member

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

    HoShiMin Well-Known Member

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

    M0rg0t Well-Known Member

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

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

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

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Да, только на 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 нравится это.
  7. Andrey333

    Andrey333 Member

    Публикаций:
    0
    Регистрация:
    30 янв 2020
    Сообщения:
    35
    А как поступать на AMD процессорах? Там ведь нельзя перехватывать отдельно чтение. Есть ли способ перехватывать системные вызовы без сильной просадки профайла?
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Andrey333,

    У амд и нтел одинаковая архитектура. Системный вызов в каком режиме, те какой мод. compat/legacy?

    wow это симулятор и там сервисный захват заложен архитектурно.
     
  9. Andrey333

    Andrey333 Member

    Публикаций:
    0
    Регистрация:
    30 янв 2020
    Сообщения:
    35
    У них отличия при реализации гипервизора (технологии: Intel VT-x и AMD-V). На обоих процессорах (посредством гипервизора) мы можем добавить дополнительный уровень трансляции адреса. Т.е. виртуальный адрес, после трансляции в физический, подвергается ещё одному преобразованию.
    Вот статья HoShiMin-а. Там подробней.

    Так вот. Вхождения в EPT имеют биты позволяющие разрешать/запрещать доступ на read/write/execute. Если, к примеру, гостевой код попытается прочитать память для которой read-бит будет сброшен, произойдет выход из виртуальной машины и наш каллбэк в хосте получит управление. На этом основано скрытие патча от patchguard-a. При чтении мы подсовываем ложные данные (будто патча не было), а выполнение мы не ловим вообще.

    Проблема с AMD-V. Там нельзя отдельно от чтения отловить исполнение. Т.е. каждая выполненная инструкция будет приводить к выходу из VM. Просядет профайл.
    --- Сообщение объединено, 8 янв 2022 ---
    Compatibility mode и 64-Bit Mode. Если я не ошибаюсь. В общем Windows 64-разрядная.
     
  10. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Именно системные вызовы (юзермод -> ядро) - можно.
    Для этого поменяй адреса обработчиков в MSR IA32_LSTAR/CSTAR, повесь триггер в гипервизоре на чтение MSR и подмени адрес прочитанного обработчика на оригинальный.
    При выполнении syscall не читает MSR явно, поэтому управление будет передано на твой обработчик. А PG при попытке прочитать эти MSR через rdmsr наткнётся на твой фильтр в гипервизоре, где ты отдашь ему оригинальный адрес.

    Что же касается перехвата произвольных функций, то без существенной просадки производительности на AMD перехватить их нельзя.
     
    Andrey333 нравится это.
  11. Andrey333

    Andrey333 Member

    Публикаций:
    0
    Регистрация:
    30 янв 2020
    Сообщения:
    35
    А оно точно реализуемо. Я читал, что при таком подходе, есть проблемы с Meltdown mitigation.
    --- Сообщение объединено, 8 янв 2022 ---
    Вот, нашел:

    Hypervisor From Scratch – Part 8
     
    Последнее редактирование: 8 янв 2022
  12. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Ну, формально возможность такая есть. Надо глянуть, что вообще делает эта защита от Meltdown и почему мы не можем сделать то же самое у себя. Может и можно.
    Но в целом, это ничего не меняет: других способов всё равно нет. Или костылить с поддержкой защит от Meltdown, или не меньше костылить со скрытием сплайсинга в NPT. И ещё неизвестно, что будет более костыльно.
     
    Andrey333 нравится это.
  13. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Andrey333,

    > У них отличия при реализации гипервизора

    А причём тут гипер ?

    В режиме совместимости тот самый wow для оптимизации используется индексация по числу аргументов, turbothunk. На старших версиях системы 10 встроен ядерный механизм сервисной фильтрации. Что использовать учитывая KPP зависит от задачи. Обычно в ядро незачем лезть, да просто нет смысла - сервисы там юзаются редко. В юзер можно любое апп взять на трансляцию(dbi). Что касательно профайла то тут где то есть моя старая тема, для детекта трассировки использовался сервисный шлюз и детект строился по разнице в таймингах.
    --- Сообщение объединено, 8 янв 2022 ---
    > Meltdown

    Планировщик нт не позволяет стабильно такие атаки проводить, тут есть тема и тесты. Эти атаки заточены под никсы.
     
  14. HoShiMin

    HoShiMin Well-Known Member

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

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    HoShiMin,

    Как он защищён ?

    Твой помню неплохо так дий раскрутил.
     
  16. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    А вот например, в античитах есть драйвера, которые из ядра проверяют адресное пространство процесса и не дают подгрузить туда сторонний код или взять процесс под отладку.
    А задачка, например, замануалмапить в процесс дллку, чтобы сам процесс её не нашёл.
     
    Indy_ нравится это.
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    HoShiMin,

    Античиты это отдельная тема. Замапить либу что бы никто не нашёл - да легко. Старая добрая техника IDP", переросла она затем в анклавы :)