Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: minifilter для USB-флешек  (Прочитано 10405 раз)
0 Пользователей и 1 Гость смотрят эту тему.
workervetal
Новенький

ua
Offline Offline
Пол: Мужской

« : 24-11-2010 10:54 » 

Пишу минифильтр-драйвер файловой системы для USB-флешек. Опытным путем определил, что  UDB-флешки от других дисков отличаются тем,  что в InstanceSetup () после выполнения  FltGetVolumeProperties() получаю:
DEVICE_TYPE =FILE_DEVICE_DISK_FILE_SYSTEM
VolumeProperty.DeviceCharacteristics = 257
При заражении ПК вирусом типа CopyTo.lnk ситуация меняется:
DEVICE_TYPE =FILE_DEVICE_DISK_FILE_SYSTEM
VolumeProperty.DeviceCharacteristics = 0 (как у жесткого диска)  Быть такого не может

Вопрос первый: что значит это 257?
Вопрос второй: как определять со 100% гарантией из минифильтра что подключаемый том находится именно на сменном USB-носителе (флешке)

Вот код InstanceSetup:
Код:
//Вызывается, когда подключается устройство (диск)
NTSTATUS
InstanceSetup (
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __in FLT_INSTANCE_SETUP_FLAGS Flags,
    __in DEVICE_TYPE VolumeDeviceType,
    __in FLT_FILESYSTEM_TYPE VolumeFilesystemType
    )
{

FLT_VOLUME_PROPERTIES  VolumeProperty;
ULONG    LengthReturned;

    UNREFERENCED_PARAMETER( FltObjects );
    UNREFERENCED_PARAMETER( Flags );
    UNREFERENCED_PARAMETER( VolumeFilesystemType );

    PAGED_CODE();

    ASSERT( FltObjects->Filter == DriverData.Filter );

    FltGetVolumeProperties(FltObjects->Volume,&VolumeProperty,sizeof(FLT_VOLUME_PROPERTIES),& LengthReturned);

    DbgPrint("++++++++++++++++ FLT_VOLUME_PROPERTY ++++++++++++++++++++\n");
    DbgPrint("IN DEVICE_TYPE = %d\n",VolumeDeviceType);
    DbgPrint("DEVICE_TYPE = %d\n", VolumeProperty.DeviceType);
    DbgPrint("DeviceCharacteristics = %d\n", VolumeProperty.DeviceCharacteristics);
    DbgPrint("FileSystemDriverName = %wZ\n", &VolumeProperty.FileSystemDriverName);
    DbgPrint("FileSystemDeviceName = %wZ\n", &VolumeProperty. FileSystemDeviceName);
    DbgPrint("RealDeviceName = %wZ\n", &VolumeProperty.RealDeviceName);

    // узнаем тип подключаемого VolumeProperty.DeviceType
    switch(VolumeProperty.DeviceType)
    {
case FILE_DEVICE_8042_PORT:
DbgPrint("FILE_DEVICE_8042_PORT");
break;
case FILE_DEVICE_ACPI:
DbgPrint("FILE_DEVICE_ACPI");
break;
case FILE_DEVICE_BATTERY:
DbgPrint("FILE_DEVICE_BATTERY");
break;
case FILE_DEVICE_BEEP:
DbgPrint("FILE_DEVICE_BEEP");
break;
case FILE_DEVICE_BUS_EXTENDER:
DbgPrint("FILE_DEVICE_BUS_EXTENDER");
break;
case FILE_DEVICE_CD_ROM:
DbgPrint("FILE_DEVICE_CD_ROM");
break;
case FILE_DEVICE_CD_ROM_FILE_SYSTEM:
DbgPrint("FILE_DEVICE_CD_ROM_FILE_SYSTEM");
break;
case FILE_DEVICE_CHANGER:
DbgPrint("FILE_DEVICE_CHANGER");
break;
case FILE_DEVICE_CONTROLLER:
DbgPrint("FILE_DEVICE_CONTROLLER");
break;
case FILE_DEVICE_DATALINK:
DbgPrint("FILE_DEVICE_DATALINK");
break;
case FILE_DEVICE_DFS:
DbgPrint("FILE_DEVICE_DFS");
break;
case FILE_DEVICE_DFS_FILE_SYSTEM:
DbgPrint("FILE_DEVICE_DFS_FILE_SYSTEM");
break;
case FILE_DEVICE_DFS_VOLUME:
DbgPrint("FILE_DEVICE_DFS_VOLUME");
break;
case FILE_DEVICE_DISK:
DbgPrint("FILE_DEVICE_DISK");
break;
case FILE_DEVICE_DISK_FILE_SYSTEM:
DbgPrint("FILE_DEVICE_DISK_FILE_SYSTEM");
break;
case FILE_DEVICE_DVD:
DbgPrint("FILE_DEVICE_DVD");
break;
case FILE_DEVICE_FILE_SYSTEM:
DbgPrint("FILE_DEVICE_FILE_SYSTEM");
break;
case FILE_DEVICE_FIPS:
DbgPrint("FILE_DEVICE_FIPS");
break;
case FILE_DEVICE_FULLSCREEN_VIDEO:
DbgPrint("FILE_DEVICE_FULLSCREEN_VIDEO");
break;
case FILE_DEVICE_INPORT_PORT:
DbgPrint("FILE_DEVICE_INPORT_PORT");
break;
case FILE_DEVICE_KEYBOARD:
DbgPrint("FILE_DEVICE_KEYBOARD");
break;
case FILE_DEVICE_KS:
DbgPrint("FILE_DEVICE_KS");
break;
case FILE_DEVICE_KSEC:
DbgPrint("FILE_DEVICE_KSEC");
break;
case FILE_DEVICE_MAILSLOT:
DbgPrint("FILE_DEVICE_MAILSLOT");
break;
case FILE_DEVICE_MASS_STORAGE:
DbgPrint("FILE_DEVICE_MASS_STORAGE");
break;
case FILE_DEVICE_MIDI_IN:
DbgPrint("FILE_DEVICE_MIDI_IN");
break;
case FILE_DEVICE_MIDI_OUT:
DbgPrint("FILE_DEVICE_MIDI_OUT");
break;
case FILE_DEVICE_MODEM:
DbgPrint("FILE_DEVICE_MODEM");
break;
case FILE_DEVICE_MOUSE:
DbgPrint("FILE_DEVICE_MOUSE");
break;
case FILE_DEVICE_MULTI_UNC_PROVIDER:
DbgPrint("FILE_DEVICE_MULTI_UNC_PROVIDER");
break;
case FILE_DEVICE_NAMED_PIPE:
DbgPrint("FILE_DEVICE_NAMED_PIPE");
break;
case FILE_DEVICE_NETWORK:
DbgPrint("FILE_DEVICE_NETWORK");
break;
case FILE_DEVICE_NETWORK_BROWSER:
DbgPrint("FILE_DEVICE_NETWORK_BROWSER");
break;
case FILE_DEVICE_NETWORK_FILE_SYSTEM:
DbgPrint("FILE_DEVICE_NETWORK_FILE_SYSTEM");
break;
case FILE_DEVICE_NETWORK_REDIRECTOR:
DbgPrint("FILE_DEVICE_NETWORK_REDIRECTOR");
break;
case FILE_DEVICE_NULL:
DbgPrint("FILE_DEVICE_NULL");
break;
case FILE_DEVICE_PARALLEL_PORT:
DbgPrint("FILE_DEVICE_PARALLEL_PORT");
break;
case FILE_DEVICE_PHYSICAL_NETCARD:
DbgPrint("FILE_DEVICE_PHYSICAL_NETCARD");
break;
case FILE_DEVICE_PRINTER:
DbgPrint("FILE_DEVICE_PRINTER");
break;
case FILE_DEVICE_SCANNER:
DbgPrint("FILE_DEVICE_SCANNER");
break;
case FILE_DEVICE_SCREEN:
DbgPrint("FILE_DEVICE_SCREEN");
break;
case FILE_DEVICE_SERENUM:
DbgPrint("FILE_DEVICE_SERENUM");
break;
case FILE_DEVICE_SERIAL_MOUSE_PORT:
DbgPrint("FILE_DEVICE_SERIAL_MOUSE_PORT");
break;
case FILE_DEVICE_SERIAL_PORT:
DbgPrint("FILE_DEVICE_SERIAL_PORT");
break;
case FILE_DEVICE_SMARTCARD:
DbgPrint("FILE_DEVICE_SMARTCARD");
break;
case FILE_DEVICE_SMB:
DbgPrint("FILE_DEVICE_SMB");
break;
case FILE_DEVICE_SOUND:
DbgPrint("FILE_DEVICE_SOUND");
break;
case FILE_DEVICE_STREAMS:
DbgPrint("FILE_DEVICE_STREAMS");
break;
case FILE_DEVICE_TAPE:
DbgPrint("FILE_DEVICE_TAPE");
break;
case FILE_DEVICE_TAPE_FILE_SYSTEM:
DbgPrint("FILE_DEVICE_TAPE_FILE_SYSTEM");
break;
case FILE_DEVICE_TERMSRV:
DbgPrint("FILE_DEVICE_TERMSRV");
break;
case FILE_DEVICE_TRANSPORT:
DbgPrint("FILE_DEVICE_TRANSPORT");
break;
case FILE_DEVICE_UNKNOWN:
DbgPrint("FILE_DEVICE_UNKNOWN");
break;
case FILE_DEVICE_VDM:
DbgPrint("FILE_DEVICE_VDM");
break;
case FILE_DEVICE_VIDEO:
DbgPrint("FILE_DEVICE_VIDEO");
break;
case FILE_DEVICE_VIRTUAL_DISK:
DbgPrint("FILE_DEVICE_VIRTUAL_DISK");
break;
case FILE_DEVICE_WAVE_IN :
DbgPrint("FILE_DEVICE_WAVE_IN ");
break;
case FILE_DEVICE_WAVE_OUT:
DbgPrint("FILE_DEVICE_WAVE_OUT");
break;

default:
DbgPrint("DeviceType UNKNOWN");
}

DbgPrint("===========================================================\n");

// не аттачимся к  СД/ДВД-дискам
if(VolumeProperty.DeviceType == FILE_DEVICE_CD_ROM_FILE_SYSTEM)
{
return STATUS_FLT_DO_NOT_ATTACH;
}


if((VolumeProperty.DeviceType == FILE_DEVICE_DISK_FILE_SYSTEM))
{
                //не аттачимся к жестким дискам
if(VolumeProperty.DeviceCharacteristics != 0)
{
DbgPrint("ATTACHED\n");
return STATUS_SUCCESS;
}
}

return STATUS_FLT_DO_NOT_ATTACH;
}
Записан

Писать на стенах туалета
Скажу я Вам - не мудрено
Среди го..на Мы все - поэты
Среди поэтов Мы - ...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 24-11-2010 14:37 » 

насчет 257 - как обычно надо искать msdn: Specifying Device Characteristics
Код:
typedef struct _FLT_VOLUME_PROPERTIES {
    //  The possible DeviceTypes are defined in NTIFS.H and begin with
    //  FILE_DEVICE_
    DEVICE_TYPE DeviceType;
    //
    //  The possible DeviceCharacteristics flags are defined in NTIFS.H.
    //  Potential values are:
    //      FILE_REMOVABLE_MEDIA
    //      FILE_READ_ONLY_DEVICE
    //      FILE_FLOPPY_DISKETTE
    //      FILE_WRITE_ONCE_MEDIA
    //      FILE_REMOTE_DEVICE
    //      FILE_DEVICE_IS_MOUNTED
    //      FILE_VIRTUAL_VOLUME
    //      FILE_AUTOGENERATED_DEVICE_NAME
    //      FILE_DEVICE_SECURE_OPEN
    ULONG DeviceCharacteristics;
...
по файлу wdm.h это сумма:
#define FILE_REMOVABLE_MEDIA                    0x00000001
#define FILE_DEVICE_SECURE_OPEN                 0x00000100

насчет второго...  тут есть более компетентные товарищи, пусть сначала они выскажутся Ага
« Последнее редактирование: 24-11-2010 14:40 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
workervetal
Новенький

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 24-11-2010 16:41 » 

Спасибо, а то я знаю, что так работает, но не знаю почему... С ума сойти...

Добавлено через 9 минут и 11 секунд:
Второй вопрос - актуален. Может кто знает, как гарантированно подключиться именно к USB-флешке. А то ведь вирусов нынче... С ума сойти...
Не хочется от них зависеть.
« Последнее редактирование: 24-11-2010 16:50 от workervetal » Записан

Писать на стенах туалета
Скажу я Вам - не мудрено
Среди го..на Мы все - поэты
Среди поэтов Мы - ...
x64
Участник

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 26-11-2010 21:18 » 

Прежде всего, необходимо определить тип шины. Это можно сделать двумя способами:

1. Вызов IoGetDeviceProperty() с классом DevicePropertyBusTypeGuid, для флешки на выходе будет GUID_BUS_TYPE_USB.
2. Запрос IOCTL_STORAGE_QUERY_PROPERTY с кодом StorageDeviceProperty, в структуре STORAGE_DEVICE_DESCRIPTOR для флешки на выходе будет BusType = BusTypeUsb.

В файловом фильтре лучше всего это делать в момент монтирования тома для storage stack device, которое по адресу pVpb -> RealDevice. Но это ещё не всё. Дело в том, что отличить таким образом внешний HDD от флешки не получится, т.к. у них у обоих шина - USB. Самый простой вариант это, конечно же, посмотреть характеристики устройства в pDevObj -> Characteristics и проверить там наличия флага FILE_REMOVABLE_MEDIA, но этот метод не подходит для специфических случаев, указанных выше (наличие руткита, например). Можно попробовать эвристические методы. Например, на жёстком диске всегда есть MBR, но на флешках MBR может отсутствовать в принципе, в этом случае в 0 секторе идёт сразу загрузочный сектор файловой системы. Правда, следует помнить, что это исключительная ситуация. Другой пример: на жёстких дисках записи о разделах в MBR идут первыми, а на флешке запись об одном единственном разделе может идти 4-ой. Ну и так далее, 100% надёжного способа тут боюсь, что нет.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 27-11-2010 19:59 » 

workervetal, лично я пользуюсь способом IOCTL_STORAGE_QUERY_PROPERTY. Средствами ОС действительно нереально отличить usb-винт от флэшки, да и все "ручные" методы завязаны на различных "если". Но на практике это в общем-то и не требуется никогда. Какая разница usb-винт это или флэшка. Главное что это внешний storage-девайс, для которого, к тому же, известен тип шины. В вашем случае, даже тип шины будет излишней информацией, ведь главное определить, что это Removable девайс. Для этого есть еще такие варианты: IOCTL_STORAGE_GET_HOTPLUG_INFO и IOCTL_STORAGE_QUERY_PROPERTY.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines