FS Minifilter. Как сделать подсчет хеша файла
От: sergey77666 Марс  
Дата: 10.01.18 15:12
Оценка:
А именно не того файла, с которым работают — а того исполняемого, который работает. Его контрольную сумму на данный момент.

Придумал такое решение:
— в каллбеке фильтра информация (включая путь к этому exe) не добавляется сразу в глобальную очередь записи в лог, а создается новый поток и она передается в него
— этот поток пытается открыть файл и посчитать MD5, результат добавляет в глобальную очередь
— поток логирования, как и сейчас, каждые N времени проверяет, не пуста ли очередь, если полна — создает файл лога и пишет ее всю

Но есть вопросы:
— насчет открывания файлов, насколько будет велик шанс, что он сможет открыть EXE-файл, который, скорее всего, сейчас выполняется?
— сможет ли он открывать его так, чтобы гарантированно не повредить ему этим (если тот читает себя самого — SFX, например)?
— нету ли все-таки какого-то более готового способа получить хоть какой-то хеш EXE-файла? Который не только лежит на диске как файл, но и загружается как процесс.
— как лучше упорядочить все это? Сейчас каждая запись лога датирована временем перехвата, имя файла лога датировано временем выгрузки в потоке логирования. Смотрим лог "12:00", видим в нем события между предыдущим логом и 12:00.
А с этим MD5 мы получим нарушенный порядок везде...
Если кратко, то вопрос: драйверу лучше на это забить совсем (пусть утилита для чтения логов упорядочивает) или пытаться все-таки привести в нормальный вид?
Отредактировано 10.01.2018 15:19 sergey77666 . Предыдущая версия . Еще …
Отредактировано 10.01.2018 15:18 sergey77666 . Предыдущая версия .
Отредактировано 10.01.2018 15:16 sergey77666 . Предыдущая версия .
Отредактировано 10.01.2018 15:13 sergey77666 . Предыдущая версия .
Re: FS Minifilter. Как сделать подсчет хеша файла
От: EreTIk EreTIk's Box
Дата: 10.01.18 20:23
Оценка:
Здравствуйте, sergey77666, Вы писали:

S>А именно не того файла, с которым работают — а того исполняемого, который работает. Его контрольную сумму на данный момент.


S>Придумал такое решение:

S>- в каллбеке фильтра информация (включая путь к этому exe) не добавляется сразу в глобальную очередь записи в лог, а создается новый поток и она передается в него
S>- этот поток пытается открыть файл и посчитать MD5, результат добавляет в глобальную очередь
S>- поток логирования, как и сейчас, каждые N времени проверяет, не пуста ли очередь, если полна — создает файл лога и пишет ее всю

S>Но есть вопросы:

S>- насчет открывания файлов, насколько будет велик шанс, что он сможет открыть EXE-файл, который, скорее всего, сейчас выполняется?
Само по себе исполнение никак не блокирует разделяемый доступ на чтение. Но так как не планируется сохранять целостность exe-файла, он (exe-файл) может быть переименован или (если процесс успеет помереть) изменен-удален.

S>- сможет ли он открывать его так, чтобы гарантированно не повредить ему этим (если тот читает себя самого — SFX, например)?

Чтение файла не конфликтует с его исполнением. Side-эффекты могут быть, например: процесс уничтожился, exe-файл пытаются удалить, но при этом происходит расчет MD5. Либо файл для расчета открыт так, что удаление будет невозможно, либо удаление будет успешным, но создать файл с тем же именем поверх будет невозможно до окончания вычисления MD5.

S>- нету ли все-таки какого-то более готового способа получить хоть какой-то хеш EXE-файла? Который не только лежит на диске как файл, но и загружается как процесс.

В PE заголовке есть CheckSum (_IMAGE_OPTIONAL_HEADER), но для EXE-файлов процессов поле может быть некорректным и/или незаполненным.

S>- как лучше упорядочить все это? <...>

Лучше вынести все, что можно из драйвера в user mode, например, в Win32-сервис или просто утилиту. То есть делегировать не в отдельную нить, а унести всю обработку в свой user mode процесс (IOCTL/сообщения mini-фильров/разделяемая память через секции и события).
Re[2]: FS Minifilter. Как сделать подсчет хеша файла
От: sergey77666 Марс  
Дата: 10.01.18 20:38
Оценка:
Здравствуйте, EreTIk, Вы писали:

ETI>В PE заголовке есть CheckSum (_IMAGE_OPTIONAL_HEADER), но для EXE-файлов процессов поле может быть некорректным и/или незаполненным.


О, а из запущенного процесса нельзя ли его извлечь?

Кто-то из малварей может и будет специально его портить. Но 70-98% не будут.

ETI>Лучше вынести все, что можно из драйвера в user mode, например, в Win32-сервис или просто утилиту. То есть делегировать не в отдельную нить, а унести всю обработку в свой user mode процесс (IOCTL/сообщения mini-фильров/разделяемая память через секции и события).


Ссылка наверно хорошая, но в данном случае заказчик за монолит.
Re[3]: FS Minifilter. Как сделать подсчет хеша файла
От: EreTIk EreTIk's Box
Дата: 10.01.18 20:59
Оценка:
ETI>>В PE заголовке есть CheckSum (_IMAGE_OPTIONAL_HEADER), но для EXE-файлов процессов поле может быть некорректным и/или незаполненным.

S>О, а из запущенного процесса нельзя ли его извлечь?

PE-заголовок проецируется как часть exe-файла, нужно только его разобрать (относительно MZ-заголовка). PsGetProcessSectionBaseAddress не документирована MSDN'ом, но экспортируется ядром и дает адрес MZ-заголовка.

S>Кто-то из малварей может и будет специально его портить. Но 70-98% не будут.

К сожалению, даже не все линкеры проставляют это поле по умолчанию. Требование к корректности этого поля есть, например, у sys-файлов драйверов, а у exe-файлов процесса — нет.
В IMAGE_FILE_HEADER есть поле TimeDateStamp, заполнено чаще.
Re[4]: FS Minifilter. Как сделать подсчет хеша файла
От: sergey77666 Марс  
Дата: 10.01.18 21:08
Оценка:
Здравствуйте, EreTIk, Вы писали:


ETI>>>В PE заголовке есть CheckSum (_IMAGE_OPTIONAL_HEADER), но для EXE-файлов процессов поле может быть некорректным и/или незаполненным.


S>>О, а из запущенного процесса нельзя ли его извлечь?

ETI>PE-заголовок проецируется как часть exe-файла, нужно только его разобрать (относительно MZ-заголовка). PsGetProcessSectionBaseAddress не документирована MSDN'ом, но экспортируется ядром и дает адрес MZ-заголовка.

S>>Кто-то из малварей может и будет специально его портить. Но 70-98% не будут.

ETI>К сожалению, даже не все линкеры проставляют это поле по умолчанию. Требование к корректности этого поля есть, например, у sys-файлов драйверов, а у exe-файлов процесса — нет.
ETI>В IMAGE_FILE_HEADER есть поле TimeDateStamp, заполнено чаще.

А вот из цифровой подписи (если же таковая имеется) нельзя ли извлечь какой-нибудь хеш? Или просто проверить ее корректность. В kernel-mode.
Re[5]: FS Minifilter. Как сделать подсчет хеша файла
От: EreTIk EreTIk's Box
Дата: 11.01.18 07:11
Оценка:
S>А вот из цифровой подписи (если же таковая имеется) нельзя ли извлечь какой-нибудь хеш? Или просто проверить ее корректность. В kernel-mode.
Документированного способа нет. Но на Vista и более современных ОС для kernel mode есть ci.dll, которую использует ядро и драйвера для проверки корректности цифровой подписи.
Re: FS Minifilter. Как сделать подсчет хеша файла
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.01.18 08:07
Оценка:
Здравствуйте, sergey77666, Вы писали:

S>- этот поток пытается открыть файл и посчитать MD5, результат добавляет в глобальную очередь


Не надо md5. Мало того, что она уже не секурная, в среднесрочной перспективе она даже не самая быстрая. Для подсчета SHA в более-менее современных процессорах есть специальные командочки, а для MD5 нет и не будет.
Re[2]: FS Minifilter. Как сделать подсчет хеша файла
От: sergey77666 Марс  
Дата: 11.01.18 08:32
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, sergey77666, Вы писали:


S>>- этот поток пытается открыть файл и посчитать MD5, результат добавляет в глобальную очередь


Pzz>Не надо md5. Мало того, что она уже не секурная, в среднесрочной перспективе она даже не самая быстрая. Для подсчета SHA в более-менее современных процессорах есть специальные командочки, а для MD5 нет и не будет.


А CRC?
Re[3]: FS Minifilter. Как сделать подсчет хеша файла
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.01.18 08:35
Оценка:
Здравствуйте, sergey77666, Вы писали:

Pzz>>Не надо md5. Мало того, что она уже не секурная, в среднесрочной перспективе она даже не самая быстрая. Для подсчета SHA в более-менее современных процессорах есть специальные командочки, а для MD5 нет и не будет.


S>А CRC?


Что CRC?
Re[4]: FS Minifilter. Как сделать подсчет хеша файла
От: sergey77666 Марс  
Дата: 11.01.18 15:54
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, sergey77666, Вы писали:


Pzz>>>Не надо md5. Мало того, что она уже не секурная, в среднесрочной перспективе она даже не самая быстрая. Для подсчета SHA в более-менее современных процессорах есть специальные командочки, а для MD5 нет и не будет.


S>>А CRC?


Pzz>Что CRC?


Применить его тут вместо md5.
Re[5]: FS Minifilter. Как сделать подсчет хеша файла
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.01.18 16:54
Оценка:
Здравствуйте, sergey77666, Вы писали:

Pzz>>Что CRC?


S>Применить его тут вместо md5.


Ну он не секьюрный ни разу. Вероятность совпадения crc у двух случайно выбраных файлов ощутимо не равна нулю, и подделать его ничего не стоит.
Re[6]: FS Minifilter. Как сделать подсчет хеша файла
От: sergey77666 Марс  
Дата: 11.01.18 17:08
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, sergey77666, Вы писали:


Pzz>>>Что CRC?


S>>Применить его тут вместо md5.


Pzz>Ну он не секьюрный ни разу.


Помилуйте! Почитайте другие темы. Этот минифильтр не логирует MMF, не логирует обращения к файлам начатые не с 0 оффсета, а вы о каком-то аццком "секьюрити" печетесь.

Я про скорость спросил!
Re[7]: FS Minifilter. Как сделать подсчет хеша файла
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.01.18 17:25
Оценка:
Здравствуйте, sergey77666, Вы писали:

S>Я про скорость спросил!


Скорость должна быть неплохая. У интела, к тому же, есть командочки, чтобы CRC32 быстро считать. Но не факт, что именно ваша реализация их использует.
Re[5]: FS Minifilter. Как сделать подсчет хеша файла
От: Слава  
Дата: 11.01.18 18:10
Оценка:
Здравствуйте, sergey77666, Вы писали:

Pzz>>Что CRC?

S>Применить его тут вместо md5.

Он еще хуже и подбирается влёт.
Re[6]: FS Minifilter. Как сделать подсчет хеша файла
От: sergey77666 Марс  
Дата: 11.01.18 18:16
Оценка:
Здравствуйте, Слава, Вы писали:

С>Здравствуйте, sergey77666, Вы писали:


Pzz>>>Что CRC?

S>>Применить его тут вместо md5.

С>Он еще хуже и подбирается влёт.


Не думаю, что когда пираты заражают инсталлятор, то они сидят и подбирают байты, чтобы CRC совпал с оригинальным, прежде чем выложить файл на торрент или свой сайтик.
Отредактировано 11.01.2018 18:17 sergey77666 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.