Драйвер фильтр флеш памяти
От: megamanrsdn  
Дата: 05.05.08 22:05
Оценка:
Нужно написать драйвер филтр флешки. что б перехватывать запросы чтения, записи только от флеш памяти.
сам фильтр, аппер, и цепляется над usbhub. Пока неполучается нормально его аттачить
вот фрагмент
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) 
{
    NTSTATUS          status;
    UNICODE_STRING    devName; 
    PDEVICE_OBJECT    fdo;
    int i;

    DbgPrint("DriverEntry...");

    for(i=0; i<IRP_MJ_MAXIMUM_FUNCTION; i++)
    {
        DriverObject->MajorFunction[i] = DispatchPass;
    }

    DriverObject->DriverUnload = FilterDriverUnload;
    
    status = IoCreateDevice(DriverObject,sizeof(PDEVICE_OBJECT),NULL,FILE_DEVICE_MASS_STORAGE,0,FALSE,&fdo);
    if(!NT_SUCCESS(status))return status;
    fdo->Flags |= 0x3040;

    RtlInitUnicodeString(&devName,L"\\Device\\USBPDO-2");

    status = IoGetDeviceObjectPointer(&devName,STANDARD_RIGHTS_ALL,&FileObj,&pdDevObjTarg);
    if(!NT_SUCCESS(status))return status;
    
    DbgPrint("IoGetDeviceObjectPointer -ok-");

    IoAttachDeviceToDeviceStack(fdo,pdDevObjTarg);
    if(!NT_SUCCESS(status))return status;
    
    DbgPrint("IoAttachDeviceToDeviceStack -ok-");

    
    return STATUS_SUCCESS;
}
/*************************************************************************/
VOID FilterDriverUnload(IN PDRIVER_OBJECT fdo)
{
    IoDetachDevice(pdDevObjTarg);
    ObDereferenceObject(FileObj);
    IoDeleteDevice(fdo->DeviceObject); 

    DbgPrint("FilterDriverUnload");

}

ТАк я делаю? подкажите если что.
Загружаю его лоадером. показывается в DeviceTree, что он прицепился. после повторной загрузки пишет что такая служба уже есть и вылетает. а в DeviceTree ничего нет. ЧТо делать?

сам лоадер

int main()
{
    cout<<" ------------------- "<<endl;
    cout<<"| Loader is running |"<<endl;
    cout<<" ------------------- "<<endl;

    SC_HANDLE sch = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);  
    if(sch)
    {
        SC_HANDLE schServiceUSB = CreateService(sch,"FilterDriver","FilterDriver",SERVICE_ALL_ACCESS,
                                             SERVICE_KERNEL_DRIVER,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
                                             "C:\\FilterDriver\\sys\\objchk\\i386\\FilterDriver.sys",NULL,NULL,NULL,NULL,NULL);
        if(schService)
        {
            if(StartService(schService,NULL,NULL))
            {
                cout<<"PAUSE: Press any key to exit pause..."<<endl;
                while(!getch());

                SERVICE_STATUS ServiceStatus;
                if(ControlService(schService,SERVICE_CONTROL_STOP,&ServiceStatus))
                {cout<<"ControlService - status ok"<<endl;}
                else{cout<<"Error ControlService..."<<endl;ErrorView();}
                
                if(DeleteService(schService))
                {cout<<"DeleteService - status ok"<<endl;}
                else{cout<<"Error DeleteService..."<<endl;ErrorView();}/**/
                
                if(CloseServiceHandle(schService))
                {cout<<"CloseServiceHandle - status ok"<<endl;}
                else{cout<<"Error CloseServiceHandle..."<<endl;ErrorView();}/**/
                
                if(CloseServiceHandle(sch))
                {cout<<"CloseServiceHandle - status ok"<<endl;}
                else{cout<<"Error CloseServiceHandle..."<<endl;ErrorView();}/**/
/*---------------------------------------------------------------------------------------------------------*/
            }else{cout<<"Error StartService..."<<endl;ErrorView();}
        }else{cout<<"Error CreateService..."<<endl;ErrorView();}
     }else{cout<<"Error OpenSCManager..."<<endl;ErrorView();}
    
    cout<<" ------------------- "<<endl;
    cout<<"| Loader is stopped |"<<endl;
    cout<<" ------------------- "<<endl;
    cout<<"Press any key to exit"<<endl;
    while(!getch());
    return 0;
}
Re: Драйвер фильтр флеш памяти
От: _f_b_i_  
Дата: 06.05.08 08:07
Оценка:
Здравствуйте, megamanrsdn, Вы писали:

<Skip>
1. Взять за основу WDM фильтр, потому что то что вы привели это похоже на legacy. Примеров таких пустых заглушек в инете и DDK полно.
2. WDM филтр не загружается по команде StartServer — т.к. он WDM — он автоматически будет включен в USB stack и загружен в момент подключения физического USB устройства.
3. Для того чтобы перехватывать все данные с флешки нужен не upper фильтр для usb-hub, а lower-filter для ubsstor.sys
Re: Драйвер фильтр флеш памяти
От: Maxim S. Shatskih Россия  
Дата: 08.05.08 08:24
Оценка: +1
M> RtlInitUnicodeString(&devName,L"\\Device\\USBPDO-2");

Откуда взялся этот бред? фильтры к PnPшным стекам не так аттачатся, а написанием функции AddDevice.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: Драйвер фильтр флеш памяти
От: megamanrsdn  
Дата: 11.05.08 19:18
Оценка:
Здравствуйте, _f_b_i_, Вы писали:

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


___><Skip>

___>1. Взять за основу WDM фильтр, потому что то что вы привели это похоже на legacy. Примеров таких пустых заглушек в инете и DDK полно.
___>2. WDM филтр не загружается по команде StartServer — т.к. он WDM — он автоматически будет включен в USB stack и загружен в момент подключения физического USB устройства.
___>3. Для того чтобы перехватывать все данные с флешки нужен не upper фильтр для usb-hub, а lower-filter для ubsstor.sys

Спасибо большое.
Достатчно ли будет для шифрования данных, перехвытывать и шифровать только READ, (WRITE). Как отличить передается ли в них служебная информация или данные?
Re[3]: Драйвер фильтр флеш памяти
От: _f_b_i_  
Дата: 11.05.08 20:56
Оценка:
Здравствуйте, megamanrsdn, Вы писали:

M>Спасибо большое.

M>Достатчно ли будет для шифрования данных, перехвытывать и шифровать только READ, (WRITE). Как отличить передается ли в них служебная информация или данные?

Как я понял вы собираетесь шифровать данные которые записываются на флешку?
Тогда прошу учесть следующее:

Для работы с флешкой используются SCSI команды которые формируются, если не ошибаюсь disk.sys драйвером и передаются в usbstor.sys который и формирует URB пакеты(протокол общения между клиентским драйвером и драйвером хост контроллера).

Если вы установите lowerFilter на usbstor.sys то SCSI в чистом виде никогде не увидите — они будет завернуты в URB.
Тут прийдется ставить UpperFiletr на usbstor.sys. Только вот я не помню передаются ли в него данные через READ/WRITE.

Я не эксперт в области работы с файловой системой, но помоему тут будут еще грабли с кеш-менеджером!
Re[4]: Драйвер фильтр флеш памяти
От: megamanrsdn  
Дата: 13.05.08 16:02
Оценка:
Нашел пример фильтра из DDK \src\storage\filters\diskperf
Как я понял он для всех дисковых устройств? в том числе и для флешки? пакеты типа READ... я так понял перехвытывать он должен уметь.
Я поставил его через инф файл.А атачить его нужно через addfilter? Немогу разобратся с \src\storage\filters\addfilter . куда мне нужно его подключить? и как это сделать?

addfilter /device\harddisk1 /add filter
или
addfilter /device\USBPDO-2 /add filter


ПОйдет он вообще для моих целей как основа? просто больше примеров я ненашел....
Re[4]: Драйвер фильтр флеш памяти
От: megamanrsdn  
Дата: 13.05.08 19:17
Оценка:
Как я уже понял то мне только нужно изменить инф файл. что б фильтр поставился куда нужно.

Class = DiskDrive
ClassGUID = {4d36e967-e325-11ce-bfc1-08002be10318}

на что его менять? наше список ClassGUID в файле devguid.h
нужно менять на ЮСБ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.