Собственно, сабж. Где можно прочитать актуальную инфу на тему как работает перехват в ring0 ? В юзермоде как - я понимаю, а как там? Вроде как все драйвера работают в контексте 1 процесса, поэтому не надо никуда инжектится, но что дальше? И может ли авер (к примеру) перехватить все вызовы и не давать изменить эти перехваты? Вообще, используется ли "обычный" (как в юзермоде, хотпатч), или в ядре сейчас используются только "минифильтры" и прочие стандартные возможности ? Сорцы на гитхабе видел, но не хватает знаний, чтоб понять.
Перехваты работают так же, как в юзермоде, только с небольшими корректировками. Так как в ядре нет аналога VirtualProtect для ядерной памяти, создаётся Writeable-отображение нужной страницы и туда ставится патч (джамп на обработчик). Другой вариант - перехватывать системные сервисы в таблицах SSDT: требуется лишь подменить в них указатель на обработчик. Но в ядре работает PatchGuard - механизм, отслеживающий модификацию критичных данных и кода. Он периодически проверяет целостность ядра и, если увидит твои патчи, свалит систему в синий экран с ошибкой CRITICAL_STRUCTURE_CORRUPTION. Например, у меня в кб встроена хуклиба в сам драйвер и из коробки позволяет перехватывать любые функции ядра. А чтобы PatchGuard не нашёл изменений, можно скрыть патч гипервизором, отдавая на чтение страницу без патча, а на исполнение - с патчем. А для каких-то операций удобнее работать не с хуками, а с фильтрами-каллбэками. Например, для фильтрации файлов используются минифильтры, для обработки открытий\дупликаций хэндлов - ObRegisterCallbacks, для отслеживания создания процессов и потоков - Ps-каллбэки.
Ты как то поздновато решил руткит писать, патчгарды всякие, блокировка загрузки неподписанных драйверов.
Только если работает в связке с гипервизором. Без него перехватить ничего нельзя, т.к. на патчи будет триггериться PatchGuard - система не проработает и десяти минут. Кроме того, без гипервизора нельзя отслеживать записи в страницу: соответственно, перехваты антивируса может снять кто угодно. --- Сообщение объединено, 6 сен 2020 --- Не слишком актуально: есть много уязвимых подписанных драйверов от крупных вендоров, через которые можно самому залезть в ядро, а также, слитые EV-сертификаты.
Rel, мне в целом интересно, раньше даже не смотрел в сторону ядра, а сейчас как то хочется понять, как устроено все на низком уровне. Те же аверы и подобное. А руткит хз, думал написать защитное решение против шифровальщиков, но так, на уровне РоС и для обучения. Не понимаю, почему аверы их не заблочат раз и навсегда, в теории это можно сделать. HoShiMin, спасибо. А PatchGuard это только для 64 битных ОС или начиная с висты? Я что-то путаюсь в этих защитных решениях. Вроде как для 32 бит не надо сертификата, по крайней мере на вин7 не надо было. Там сложно как-то в ядре. Был такой мужик с Беларуссии, сидел на старом васме и на киберфоруме, он много писал про ядро. Вот не помню эту градацию защитных решений. Впрочем, сейчас наверное везде виндовс 10, а там вроде для ядра нужна кросс подпись MS , или нет? А EV серты, к слову, продают на блэк форумах, по ~ 2k usd, уж не знаю где они их берут, но предложения очень много.
Да, только на 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-
А как поступать на AMD процессорах? Там ведь нельзя перехватывать отдельно чтение. Есть ли способ перехватывать системные вызовы без сильной просадки профайла?
Andrey333, У амд и нтел одинаковая архитектура. Системный вызов в каком режиме, те какой мод. compat/legacy? wow это симулятор и там сервисный захват заложен архитектурно.
У них отличия при реализации гипервизора (технологии: 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-разрядная.
Именно системные вызовы (юзермод -> ядро) - можно. Для этого поменяй адреса обработчиков в MSR IA32_LSTAR/CSTAR, повесь триггер в гипервизоре на чтение MSR и подмени адрес прочитанного обработчика на оригинальный. При выполнении syscall не читает MSR явно, поэтому управление будет передано на твой обработчик. А PG при попытке прочитать эти MSR через rdmsr наткнётся на твой фильтр в гипервизоре, где ты отдашь ему оригинальный адрес. Что же касается перехвата произвольных функций, то без существенной просадки производительности на AMD перехватить их нельзя.
А оно точно реализуемо. Я читал, что при таком подходе, есть проблемы с Meltdown mitigation. --- Сообщение объединено, 8 янв 2022 --- Вот, нашел: Hypervisor From Scratch – Part 8
Ну, формально возможность такая есть. Надо глянуть, что вообще делает эта защита от Meltdown и почему мы не можем сделать то же самое у себя. Может и можно. Но в целом, это ничего не меняет: других способов всё равно нет. Или костылить с поддержкой защит от Meltdown, или не меньше костылить со скрытием сплайсинга в NPT. И ещё неизвестно, что будет более костыльно.
Andrey333, > У них отличия при реализации гипервизора А причём тут гипер ? В режиме совместимости тот самый wow для оптимизации используется индексация по числу аргументов, turbothunk. На старших версиях системы 10 встроен ядерный механизм сервисной фильтрации. Что использовать учитывая KPP зависит от задачи. Обычно в ядро незачем лезть, да просто нет смысла - сервисы там юзаются редко. В юзер можно любое апп взять на трансляцию(dbi). Что касательно профайла то тут где то есть моя старая тема, для детекта трассировки использовался сервисный шлюз и детект строился по разнице в таймингах. --- Сообщение объединено, 8 янв 2022 --- > Meltdown Планировщик нт не позволяет стабильно такие атаки проводить, тут есть тема и тесты. Эти атаки заточены под никсы.
Так обычно защищённый софт защищён и из ядра (антивирусы, игры с античитами) - к ним с юзермодными dbi не подлезешь. Нужен механизм инструментации ядра.
А вот например, в античитах есть драйвера, которые из ядра проверяют адресное пространство процесса и не дают подгрузить туда сторонний код или взять процесс под отладку. А задачка, например, замануалмапить в процесс дллку, чтобы сам процесс её не нашёл.
HoShiMin, Античиты это отдельная тема. Замапить либу что бы никто не нашёл - да легко. Старая добрая техника IDP", переросла она затем в анклавы