Сейчас на форуме: (+6 невидимых)

 [email protected] —› Программирование —› Minifilter и фильтр запросов от драйверов
Посл.ответ Сообщение

Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 17 июня 2018 01:08
· Личное сообщение · #1

Всем привет.
Пишу MiniFilter для контроля за файловой системой, это мои первые попытки написать драйвер, поэтому могу путать терминологию и чтобы не было неоднозначностей буду приводить названия используемых функций.
Фильтр устанавливаю с помощью FltRegisterFilter, контролирую IRP_MJ_CREATE и IRP_MJ_DIRECTORY_CONTROL. Внутри колбеков с помощью PsGetCurrentProcess получаю ссылку на PEPROCESS, дальше используется пара функций для определения идентификатора процесса (PsGetProcessId) и его названия. По полученным данным принимаю решение об фильтрации. Когда запрос идет из обычных приложений, то проблем никаких нет. Но если какой-либо драйвер работает с файловой системой напрямую, то PsGetProcessId ссылается на system процесс (тесты с несколькими драйверами не проводил, но как я понимаю у каждого драйвера будет свой уникальный PEPROCESS, который будет ссылаться на system-процесс). Отсюда возникает вопрос:
Можно ли как-нибудь из PEPROCESS (или любым другим способом) понять какой конкретный драйвер работает с файловой системой?
Можно попробовать сделать перехват системных функций, тогда по точке возврата есть шанс определить драйвер, но я так понимаю, что PatchGuard мне не даст этого сделать, а возиться с отключение защиты совсем не хочется (я так понял это не тривиальная задача).
Драйвер пишу для Win10 x64 и на данный момент использовать его в других системах не планирую.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 17 июня 2018 03:06
· Личное сообщение · #2

сильно не вникал, но глянь --> здесь<--, может поможет.
Статье правда три года, но мне в свое время помогла найти решение для моей задачи.
Успеха!

-----
Give me a HANDLE and I will move the Earth.




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 17 июня 2018 12:25
· Личное сообщение · #3

plutos, спасибо за ссыль, но это не то. У меня нет проблем с написание самого фильтра (к тому же в этой же статье написано, что лучше использовать minifilter, что я и делаю). Мне нужно понять какой драйвер работает с файловой системой. К сожалению, я не понимаю многих нюансов нулевого кольца, поэтому и не понимаю в какую сторону копать.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 17 июня 2018 20:48
· Личное сообщение · #4

Не будет у каждого драйвера свой PEPROCESS для system-процесса.

А для чего задача фильтровать драйвера? Если это для безопасности, то смысла нет, драйвер всегда сможет при желании обойти другой драйвер.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 17 июня 2018 23:15
· Личное сообщение · #5

user99 пишет:
К сожалению, я не понимаю многих нюансов нулевого кольца


так может с этого и нужно начинать?
Да и цель не понятна, согласен с Archer'oм.

-----
Give me a HANDLE and I will move the Earth.




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 17 июня 2018 23:24 · Поправил: user99
· Личное сообщение · #6

Archer, именно для безопасности и смысл есть: при желании можно много чего сделать, но чтобы это желание появилось нужно понимать, что тебя блокируют, а т.к. я свою разработку в Сеть не собираюсь выкладывать, то разработчик исходного подозрительного драйвера навряд ли будет делать лишние телодвижения.

Archer пишет:
Не будет у каждого драйвера свой PEPROCESS для system-процесса.

Не понял. У каждого драйвера свой уникальный PEPROCESS или он общий на всех? Можно ли по PEPROCESS выйти на конкретный экземпляр драйвера?

plutos пишет:
так может с этого и нужно начинать?

Может и стоит, но я понимаю на сколько глубоки эти дебри, и т.к. для меня это второстепенное направление, то тратить на изучение ринг0 несколько месяцев не могу.
Надеюсь, что есть люди, кто сталкивался с подобной задачей, и они смогут навести меня на путь истинный




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 18 июня 2018 02:20
· Личное сообщение · #7

user99 пишет:
Надеюсь, что есть люди, кто сталкивался с подобной задачей, и они смогут навести меня на путь истинный


дело, конечно, ваше личное, но если это так важно, то может пойти прямо в раздел --> поиск специалистов <--и там попросить помощи, вместо того, чтобы ждать у моря погоды.

-----
Give me a HANDLE and I will move the Earth.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 18 июня 2018 11:24
· Личное сообщение · #8

user99 пишет:
У каждого драйвера свой уникальный PEPROCESS или он общий на всех?

Не будет уникального. Контекст system-процесса один.

Нормально документированно задачу вряд ли решить. Но коль хочется нагородить костылей, коль оно так by design, можно попробовать походить по IO_STACK в IRP с целью выцепить DeviceObject самого нижнего драйвера. Другой вопрос, что ни разу не факт, что это он и начал изначально делать запрос. И коллстек тут тоже не поможет, запросы могут быть и отложенные.

| Сообщение посчитали полезным: ajax, user99


Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 19 июня 2018 01:18 · Поправил: difexacaw
· Личное сообщение · #9

Разработка минифильтров обычно поставлена на поток", те разраб этим занимается много лет, он это делает на автомате. Вхождение туда с нуля просто невозможно. ТС взял неподьёмную задачу.

> Можно ли как-нибудь из PEPROCESS (или любым другим способом) понять какой конкретный драйвер работает с файловой системой?

Нет. PEP* это лишь системный обьект, в контексте которого выполняется ваша задача, а для фильтров это постоянно изменяющийся контекст. Он никак не связан с драйверами. Это лишь указатель на описатель текущего контекста задачи.

-----
vx




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 19 июня 2018 13:01
· Личное сообщение · #10

difexacaw пишет:
Вхождение туда с нуля просто невозможно. ТС взял неподьёмную задачу.

Все когда-то делается впервые и насчет неподъемности задачи явное преувеличение. Конечно полноценный антивирь (или какую-либо подобную защиту) я не напишу, особенно если учитывать разнообразность компов и что у каждого пользователя программа работает по особенному, но сделать драйвер-фильтр для себя не является такой большой проблемой (особенно если можешь хардкодить по страшному).

Всем спасибо за объяснения, у меня одна идея уже родилась как можно решить свою задачу, может чуть позже выложу основную идею - покритикуете с точки зрения своего опыта.




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 19 июня 2018 16:29 · Поправил: difexacaw
· Личное сообщение · #11

user99

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

-----
vx




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 20 июня 2018 11:33
· Личное сообщение · #12

difexacaw пишет:
Так что желание не соответствует вашим возможностям.

Будем считать, что это было сказано с наилучшими пожеланиями, а не в попытке обидеть меня. Потому что глупо и непрофессионально писать такие вещи, не зная ничего о человеке.
difexacaw пишет:
Купите реализацию, иначе никак.

Знаешь какое у меня сложилось мнение о большинстве "специалистах" за то время, что живу на белом свете? Что как раз-таки им нужно руки поотрывать, потому что люди кичуются делают вид, что они все знаю и все умеют и всячески набивают себе цену, а когда начинаешь чуточку присматриваться, что же там эти горе "специалисты" натворили, то хочется за ними все переделать. Это касается не только программирования, но и многих вещей с которыми приходится сталкиваться (электрика, слесаря, ремонт и т.д.). Конечно это касается далеко не всех и есть действительно мастера своего дела, но отыскать нужных людей очень непросто и если тебе кто-то говорит "я работал с этим человеком, он отличный спец", тоже не является гарантией.
В любом случае это лирика, я услышал мнение, но пока буду придерживаться своей позиции и дальше писать то "что я написать не смогу"




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 20 июня 2018 23:31 · Поправил: difexacaw
· Личное сообщение · #13

user99

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

Хорошим примером были ав фильтры(kl, avg etc). Это показало на примере что если человек отлично может кодить в юм, то в км эти навыки бесполезны - код полное решето с точки зрения синхронизаций.

-----
vx





Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 21 июня 2018 05:23
· Личное сообщение · #14

user99, ты зацепился языками с пылью параллельных миров. Поздравляю.

| Сообщение посчитали полезным: plutos, sefkrd


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 21 июня 2018 06:10 · Поправил: plutos
· Личное сообщение · #15

Gideon Vi пишет:
ты зацепился языками с пылью параллельных миров. Поздравляю


"есть люди, которые будут говорить о чем угодно постольку поскольку они говорят о себе"
Ф.М.Достоевский (русский писатель).

Тут как раз тот случай.

-----
Give me a HANDLE and I will move the Earth.


| Сообщение посчитали полезным: f13nd, bartolomeo

Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 21 июня 2018 15:03
· Личное сообщение · #16

difexacaw, я услышал и с некоторыми моментами полностью согласен, но только с некоторыми, поэтому разработку пока не брошу

Gideon Vi,plutos, моя вас не понимать.

Вернемся к тому ради чего создавалась эта тема, а то недолог час перейдем на русскую классику, софистику и прочие сугубо философские проблемы.
Напомню суть: хочу отследить какой конкретный драйвер пытается получить доступ к файлу. Отследить через процесс невозможно, т.к. все драйверы работают в контексте системного процесса, но здесь и рождается идея: можно отследить поток. Для каждого потока можно узнать его стартовый адрес и получить взаимосвязь между потоком и драйвером. На данный момент вижу только пару нюансов:
1) некоторые потоки начинаются внутри ntoskrnl.exe (в частности с замечательной функции ExpWorkerThread), но это относится к загрузке драйвера и его выгрузке, так что это будем игнорить.
2) драйвер может замаскировать свою нить, делая запуск через какого-нибудь посредника, но опять-таки этот момент проигнорим, т.к. я борюсь не с вирусом, и там внутри такого мазохизма на данный момент нет (хотя может я о нем не знаю).
3) где-то читал, что поток можно запустить не в системном (system) процессе, а в любом другом (например, в svchost.exe или csrss.exe), на сколько знаю этим процессам нельзя полностью обрезать доступ к файлам, потому что может быть больно. Этой частью пока не занимался, но попробую почитать и провести тесты.
4) Archer писал про отложенные запросы, пока тоже не читал, что это за зверьки такие, так что будем решать проблемы по мере их поступления.
Прошу знающих людей покритиковать данную идею. Первые тесты показали, что механизм имеет право на существование, но вполне возможно, что есть какие-то подводные камни (механизмы), о которых я не знаю и которые не позволят данному способу выполнить мою задачу.



Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 10 декабря 2019 11:40
· Личное сообщение · #17

Люди добрые, подскажите какие функции контролирует ObRegisterCallbacks с параметрами PsProcessType и OB_OPERATION_HANDLE_CREATE?
Я так понимаю, что должна контролироваться только одна функция NtOpenProcess или есть еще какие-то функции, после которых срабатывает данный колбек?



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 10 декабря 2019 12:16
· Личное сообщение · #18

user99
DuplicateHandle не может быть?

-----
старый пень




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 10 декабря 2019 12:34
· Личное сообщение · #19

r_e, флаг стоит только OB_OPERATION_HANDLE_CREATE (без OB_OPERATION_HANDLE_DUPLICATE) не должно




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 10 декабря 2019 13:49
· Личное сообщение · #20

Создание процесса скорее всего этот коллбек дёрнет.


 [email protected] —› Программирование —› Minifilter и фильтр запросов от драйверов
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати