Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Слежение за записью на внешие носители


Автор: Goganchic 6.7.2008, 17:36
Всем привет!
Как известно в винде имеется достаточно серьзеная вирусная опасность, и не всегда антивирусы могут защитить (например вирус оч. новый и сигнатуры для него еще не вышли). Вот я решил сделать на уровне системы некоторую защиту (ну и попутно разобраться в системном программировании для винды). В первую очередь это касается логирования доступа всех программ к внешним носителям, таким как USB Flash. Я думаю, что это можно как-то сделать на уровне драйверов. Хотелось бы получить следующий результат: каждая операция чтения и записи должна логироваться в какой-нибудь файл, к примеру C:\Windows\usb-access.log. А записываться туда должна следующая информация: какая программа в какой момент и что пыталась сделать: записать такой-то файл на носитель или считать такой-то файл с носителя.
Кто-нибудь знает что-нибудь по данной теме?

Автор: W4FhLF 6.7.2008, 17:47
Хорошую ты себе задачку для "попутно разобраться в системном программировании для винды" поставил. smile

Цитата(Goganchic @  6.7.2008,  17:36 Найти цитируемый пост)
 Я думаю, что это можно как-то сделать на уровне драйверов. Хотелось бы получить следующий результат: каждая операция чтения и записи должна логироваться в какой-нибудь файл, к примеру C:\Windows\usb-access.log.


Начни с поиска по словосочетаниям:
file system filter driver
драйвер фильтр файловой системы

На один из первых наткнёшься на sfilter, на этом твоё желание скорее всего и угаснет smile

Автор: Goganchic 8.7.2008, 10:36
W4FhLF, почему желание угаснет?

Автор: Goganchic 19.8.2008, 11:50
Поискал инфу на эту тему, понял что надо использовать IFS Kit. Теперь у меня несколько вопросов, на которые я так и не смог найти ответов:
  • Как заказать IFS Kit? Позволяет ли мне лицения потом продавать написанное мной творение? Не буду ли я нарушать этим чьи-то авторские права?
  • С какого момента IFS Kit является частью WDK? Для Win 2000, WinXP и Win Vista драйвера будут абсолютно несовместимы?
  • Что кроме IFS Kit мне нужно для разработки драйвера-фильтра файловой системы для Windows?

Автор: Goganchic 1.9.2008, 13:35
Исследую сейчас IFS Kit (входящий в WDK) И у меня есть несколько вопросов: смотрел код sfilter-а, следующий блок:
Код

    fastIoDispatch = ExAllocatePoolWithTag( NonPagedPool,
                                            sizeof( FAST_IO_DISPATCH ),
                                            SFLT_POOL_TAG_FASTIO );
    if (!fastIoDispatch) {

        IoDeleteDevice( gSFilterControlDeviceObject );
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    RtlZeroMemory( fastIoDispatch, sizeof( FAST_IO_DISPATCH ) );

    fastIoDispatch->SizeOfFastIoDispatch = sizeof( FAST_IO_DISPATCH );
    fastIoDispatch->FastIoCheckIfPossible = SfFastIoCheckIfPossible;
    fastIoDispatch->FastIoRead = SfFastIoRead;
    fastIoDispatch->FastIoWrite = SfFastIoWrite;
    fastIoDispatch->FastIoQueryBasicInfo = SfFastIoQueryBasicInfo;
    fastIoDispatch->FastIoQueryStandardInfo = SfFastIoQueryStandardInfo;
    fastIoDispatch->FastIoLock = SfFastIoLock;
    fastIoDispatch->FastIoUnlockSingle = SfFastIoUnlockSingle;
    fastIoDispatch->FastIoUnlockAll = SfFastIoUnlockAll;
    fastIoDispatch->FastIoUnlockAllByKey = SfFastIoUnlockAllByKey;
    fastIoDispatch->FastIoDeviceControl = SfFastIoDeviceControl;
    fastIoDispatch->FastIoDetachDevice = SfFastIoDetachDevice;
    fastIoDispatch->FastIoQueryNetworkOpenInfo = SfFastIoQueryNetworkOpenInfo;
    fastIoDispatch->MdlRead = SfFastIoMdlRead;
    fastIoDispatch->MdlReadComplete = SfFastIoMdlReadComplete;
    fastIoDispatch->PrepareMdlWrite = SfFastIoPrepareMdlWrite;
    fastIoDispatch->MdlWriteComplete = SfFastIoMdlWriteComplete;
    fastIoDispatch->FastIoReadCompressed = SfFastIoReadCompressed;
    fastIoDispatch->FastIoWriteCompressed = SfFastIoWriteCompressed;
    fastIoDispatch->MdlReadCompleteCompressed = SfFastIoMdlReadCompleteCompressed;
    fastIoDispatch->MdlWriteCompleteCompressed = SfFastIoMdlWriteCompleteCompressed;
    fastIoDispatch->FastIoQueryOpen = SfFastIoQueryOpen;

    DriverObject->FastIoDispatch = fastIoDispatch;



Как я понимаю, это и есть назначение хуков на перехват обращений к файловой системе, я прав?

Автор: Goganchic 2.9.2008, 18:49
Итак, вроде бы это на самом деле так: т.е. это хуки, теперь у меня такой вопрос: как я понимаю, для того, чтобы прибиндить этот список хуков к какому-то девайсу нужно выполнить подобную инструкцию:
Код

DriverObject->FastIoDispatch = fastIoDispatch;

т.е. возникает необходимость получить список всех девайсов, и тут и есть вопрос: как это сделать?

Автор: andrew_121 3.9.2008, 11:33
Капец. Какие страсти smile  В Linux все гораздо проще smile 

Автор: ama_kid 6.9.2008, 21:15
Цитата(Goganchic @  2.9.2008,  19:49 Найти цитируемый пост)
для того, чтобы прибиндить этот список хуков к какому-то девайсу нужно выполнить подобную инструкцию:
Цитата(Goganchic @  2.9.2008,  19:49 Найти цитируемый пост)
т.е. возникает необходимость получить список всех девайсов
Хм... не увидел связи между первой и второй фразами, если честно... Как из первого следует второе? Вообще-то DriverObject - это объект, который ты получаешь в DriverEntry, объект твоего драйвера. А уже для того, чтобы приаттачить свой объект к требуемому драйверу нижнего уровня - имхо нужно использовать функцию типа IoAttachDevice, но только для IFS (к сожалению, не имею IFS'a, поэтому максимум могу дать ссылку на http://msdn.microsoft.com/en-us/library/ms790742.aspx), выбрав девайс по его имени, которое должно быть известно: типа как  L"\\Device\\RawDisk" или L"\\Device\\RawCdRom" или еще какой хочешь фильтровать, получив по имени его объект с помощью функции IoGetDeviceObjectPointer...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)