А именно не того файла, с которым работают — а того исполняемого, который работает. Его контрольную сумму на данный момент.
Придумал такое решение:
— в каллбеке фильтра информация (включая путь к этому exe) не добавляется сразу в глобальную очередь записи в лог, а создается новый поток и она передается в него
— этот поток пытается открыть файл и посчитать MD5, результат добавляет в глобальную очередь
— поток логирования, как и сейчас, каждые N времени проверяет, не пуста ли очередь, если полна — создает файл лога и пишет ее всю
Но есть вопросы:
— насчет открывания файлов, насколько будет велик шанс, что он сможет открыть EXE-файл, который, скорее всего, сейчас выполняется?
— сможет ли он открывать его так, чтобы гарантированно не повредить ему этим (если тот читает себя самого — SFX, например)?
— нету ли все-таки какого-то более готового способа получить хоть какой-то хеш EXE-файла? Который не только лежит на диске как файл, но и загружается как процесс.
— как лучше упорядочить все это? Сейчас каждая запись лога датирована временем перехвата, имя файла лога датировано временем выгрузки в потоке логирования. Смотрим лог "12:00", видим в нем события между предыдущим логом и 12:00.
А с этим MD5 мы получим нарушенный порядок везде...
Если кратко, то вопрос: драйверу лучше на это забить совсем (пусть утилита для чтения логов упорядочивает) или пытаться все-таки привести в нормальный вид?
Здравствуйте, 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. Как сделать подсчет хеша файла
Здравствуйте, EreTIk, Вы писали:
ETI>В PE заголовке есть CheckSum (_IMAGE_OPTIONAL_HEADER), но для EXE-файлов процессов поле может быть некорректным и/или незаполненным.
О, а из запущенного процесса нельзя ли его извлечь?
Кто-то из малварей может и будет специально его портить. Но 70-98% не будут.
ETI>Лучше вынести все, что можно из драйвера в user mode, например, в Win32-сервис или просто утилиту. То есть делегировать не в отдельную нить, а унести всю обработку в свой user mode процесс (IOCTL/сообщения mini-фильров/разделяемая память через секции и события).
Ссылка наверно хорошая, но в данном случае заказчик за монолит.
Re[3]: FS Minifilter. Как сделать подсчет хеша файла
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. Как сделать подсчет хеша файла
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. Как сделать подсчет хеша файла
S>А вот из цифровой подписи (если же таковая имеется) нельзя ли извлечь какой-нибудь хеш? Или просто проверить ее корректность. В kernel-mode.
Документированного способа нет. Но на Vista и более современных ОС для kernel mode есть ci.dll, которую использует ядро и драйвера для проверки корректности цифровой подписи.
Здравствуйте, sergey77666, Вы писали:
S>- этот поток пытается открыть файл и посчитать MD5, результат добавляет в глобальную очередь
Не надо md5. Мало того, что она уже не секурная, в среднесрочной перспективе она даже не самая быстрая. Для подсчета SHA в более-менее современных процессорах есть специальные командочки, а для MD5 нет и не будет.
Re[2]: FS Minifilter. Как сделать подсчет хеша файла
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, sergey77666, Вы писали:
S>>- этот поток пытается открыть файл и посчитать MD5, результат добавляет в глобальную очередь
Pzz>Не надо md5. Мало того, что она уже не секурная, в среднесрочной перспективе она даже не самая быстрая. Для подсчета SHA в более-менее современных процессорах есть специальные командочки, а для MD5 нет и не будет.
А CRC?
Re[3]: FS Minifilter. Как сделать подсчет хеша файла
Здравствуйте, sergey77666, Вы писали:
Pzz>>Не надо md5. Мало того, что она уже не секурная, в среднесрочной перспективе она даже не самая быстрая. Для подсчета SHA в более-менее современных процессорах есть специальные командочки, а для MD5 нет и не будет.
S>А CRC?
Что CRC?
Re[4]: FS Minifilter. Как сделать подсчет хеша файла
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, sergey77666, Вы писали:
Pzz>>>Не надо md5. Мало того, что она уже не секурная, в среднесрочной перспективе она даже не самая быстрая. Для подсчета SHA в более-менее современных процессорах есть специальные командочки, а для MD5 нет и не будет.
S>>А CRC?
Pzz>Что CRC?
Применить его тут вместо md5.
Re[5]: FS Minifilter. Как сделать подсчет хеша файла
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, sergey77666, Вы писали:
Pzz>>>Что CRC?
S>>Применить его тут вместо md5.
Pzz>Ну он не секьюрный ни разу.
Помилуйте! Почитайте другие темы. Этот минифильтр не логирует MMF, не логирует обращения к файлам начатые не с 0 оффсета, а вы о каком-то аццком "секьюрити" печетесь.
Я про скорость спросил!
Re[7]: FS Minifilter. Как сделать подсчет хеша файла
Здравствуйте, Слава, Вы писали:
С>Здравствуйте, sergey77666, Вы писали:
Pzz>>>Что CRC? S>>Применить его тут вместо md5.
С>Он еще хуже и подбирается влёт.
Не думаю, что когда пираты заражают инсталлятор, то они сидят и подбирают байты, чтобы CRC совпал с оригинальным, прежде чем выложить файл на торрент или свой сайтик.