Re[7]: Помогите - Перехват клавиатуры в w2k
От: Злость Россия  
Дата: 23.02.05 08:20
Оценка: 3 (1) +1
Здравствуйте, coder_ds, Вы писали:

[skip]

Вам надо почитать про ExQueueWorkItem или схожие с ней по функциональности. Что позволит вам запланировать выполнение свое процедуры на более низком IRQL (а именно PASSIVE_LEVEL).
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Помогите - Перехват клавиатуры в w2k
От: Storozh Россия  
Дата: 14.04.02 01:00
Оценка:
Я являюсь студентом СПбГИТМО и в рамках учебного курса "Защита информации" столкнулся со следующей
прблемой: надо написать драйвер ядра, который осуществлял бы перехват клавитуры в win2000 и выводил данные
перехвата в лог-файл.
В DDK ..src\input\kbfiltr содержится скелет такого драйвера, и, насколько я понял, запись данных
перехвата должна осуществляться внутри следующей функции

VOID KbFilter_ServiceCallback(
    IN PDEVICE_OBJECT DeviceObject,
    IN PKEYBOARD_INPUT_DATA InputDataStart,
    IN PKEYBOARD_INPUT_DATA InputDataEnd,
    IN OUT PULONG InputDataConsumed
    )
/*++
Routine Description:

    Called when there are keyboard packets to report to the RIT.  You can do 
    anything you like to the packets.  For instance:
    
    o Drop a packet altogether
    o Mutate the contents of a packet 
    o Insert packets into the stream 
                    
Arguments:

    DeviceObject - Context passed during the connect IOCTL
    
    InputDataStart - First packet to be reported
    
    InputDataEnd - One past the last packet to be reported.  Total number of
                   packets is equal to InputDataEnd - InputDataStart
    
    InputDataConsumed - Set to the total number of packets consumed by the RIT
                        (via the function pointer we replaced in the connect
                        IOCTL)

Return Value:

    Status is returned.

--*/
{
    PDEVICE_EXTENSION   devExt;

    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
        devExt->UpperConnectData.ClassDeviceObject,
        InputDataStart,
        InputDataEnd,
        InputDataConsumed);
}

code
Все мои попытки неизменно заканчиваются синим экраном смерти, и я был бы очень признателен за дельный совет или кусок работающего кода.
Re: Помогите - Перехват клавиатуры в w2k
От: MALnew  
Дата: 14.04.02 11:31
Оценка:
Здравствуйте Storozh, Вы писали:

S>В DDK ..src\input\kbfiltr содержится скелет такого драйвера, и, насколько я понял, запись данных

S>перехвата должна осуществляться внутри следующей функции

S>Все мои попытки неизменно заканчиваются синим экраном смерти, и я был бы очень признателен за дельный совет или кусок работающего кода.


DDK сейчас нет под рукой но вот тебе ссылочка http://www.sysinternals.com/ntw2k/source/ctrl2cap.shtml
Очень простой пример — проверку на CAPS_LOCK уберешь а вместо него кернелевскую запись в файл — но тоже могу быть грабли — запись в файл нормально пройдет если "приоритет драйвера"( не помню точного названия — посмотри в функции записи ) низкий
Если не пройдет то попробуй к буферу доступ найти не из ReadComplete а из ReadDispatch — здесь write можно у меня получалось
Re[2]: Помогите - Перехват клавиатуры в w2k
От: Storozh Россия  
Дата: 14.04.02 20:49
Оценка:
Здравствуйте MALnew, Вы писали:

MAL>Если не пройдет то попробуй к буферу доступ найти не из ReadComplete а из ReadDispatch — здесь write можно у меня получалось


Спасибо за ссылочку, но вот заменить Caps на Ctrl у меня и из своей программы получается:


VOID
KbFilter_ServiceCallback(
    IN PDEVICE_OBJECT DeviceObject,
    IN PKEYBOARD_INPUT_DATA InputDataStart,
    IN PKEYBOARD_INPUT_DATA InputDataEnd,
    IN OUT PULONG InputDataConsumed
    )
PDEVICE_EXTENSION   devExt;
    int i,x;
        devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    x= InputDataEnd - InputDataStart;
    
    for(  i = 0; i < x; i++ ) 
    
    {   
        
        if  (InputDataStart[i].MakeCode == CAPS_LOCK)      
        InputDataStart[i].MakeCode = LCONTROL;
   
    (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
        devExt->UpperConnectData.ClassDeviceObject,
        InputDataStart,
        InputDataEnd,
        InputDataConsumed);
}      

}


, а вот каким образом файл открыть, да чего-нибудь туда записать — не представляю. Если есть мысли, то поделись, если не трудно, поподробнее..
Re[3]: Помогите - Перехват клавиатуры в w2k
От: MALnew  
Дата: 15.04.02 07:13
Оценка:
Здравствуйте Storozh, Вы писали:

S>Спасибо за ссылочку, но вот заменить Caps на Ctrl у меня и из своей программы получается:



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


Тогда когда BSoD выползает ?

Попробуй примерно это

Открытие

NTSTATUS status;
OBJECT_ATTRIBUTES oa;
IO_STATUS_BLOCK iostatus;
HANDLE hfile;
PUNICODE_STRING pathname;
InitializeObjectAttributes(&oa, pathname, OBJ_CASE_INSENSITIVE,NULL, NULL);
status = ZwCreateFile(&hfile, GENERIC_WRITE, &oa, &iostatus,
NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF,
FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);

Путь в виде \??\C:\dir\file.ext или \SystemRoot\dir\file.ext по моему — проверяй пробуй

Запись
PVOID buffer;
ULONG bufsize;
status = ZwWriteFile(hfile, NULL, NULL, NULL, &iostatus, buffer,bufsize, NULL, NULL);

И

ZwClose(hfile);

Но проверь IRQL он не должен быть выше, то ли DISPATCH_LEVEL, то ли PASSIVE_LEVEL
Re[4]: Помогите - Перехват клавиатуры в w2k
От: Storozh Россия  
Дата: 15.04.02 19:23
Оценка:
Здравствуйте MALnew, Вы писали:

MAL>Тогда когда BSoD выползает ?


MAL>Попробуй примерно это


А вот именно тут оно и выползает (реакция на ZwCreateFile())

MAL>Но проверь IRQL он не должен быть выше, то ли DISPATCH_LEVEL, то ли PASSIVE_LEVEL

Вот именно в этом IRQL и засада (IRQL LESS OR EQUAL)
Подскажи, пожалуйста, как быть с этим, синий экран меня уже порядком достал.
Re[5]: Помогите - Перехват клавиатуры в w2k
От: MALnew  
Дата: 17.04.02 18:12
Оценка:
Здравствуйте Storozh, Вы писали:

S>Вот именно в этом IRQL и засада (IRQL LESS OR EQUAL)

S>Подскажи, пожалуйста, как быть с этим, синий экран меня уже порядком достал.
Если бы использовать Ctrl2Cap я бы подсказал — а сорцы для kbdfltr я не имею
Re[6]: Помогите - Перехват клавиатуры в w2k
От: coder_ds  
Дата: 22.02.05 21:28
Оценка:
Вылетает на нажатие клавиши:
#define NT_FILE_NAME L"\\??\\c:\\log.txt" 

VOID
KbFilter_ServiceCallback(
    IN PDEVICE_OBJECT DeviceObject,
    IN PKEYBOARD_INPUT_DATA InputDataStart,
    IN PKEYBOARD_INPUT_DATA InputDataEnd,
    IN OUT PULONG InputDataConsumed
    )
{
    PDEVICE_EXTENSION   devExt;
    OBJECT_ATTRIBUTES oa;
    IO_STATUS_BLOCK   iosb;
    HANDLE              hFile;
    UNICODE_STRING   g_usFileName;

    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
        devExt->UpperConnectData.ClassDeviceObject,
        InputDataStart,
        InputDataEnd,
        InputDataConsumed);
    if (InputDataStart->Flags==KEY_MAKE)
    {

        RtlInitUnicodeString(&g_usFileName,NT_FILE_NAME);
        InitializeObjectAttributes(&oa,&g_usFileName,
            OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
            NULL,NULL);
        if (ZwOpenFile(&hFile,FILE_APPEND_DATA|SYNCHRONIZE,&oa,&iosb,
            FILE_SHARE_READ,FILE_SYNCHRONOUS_IO_NONALERT)==STATUS_SUCCESS)
        {

            if (ZwWriteFile(&hFile,0,NULL,NULL,&iosb,
                &InputDataStart->MakeCode,4,NULL,NULL)==STATUS_SUCCESS);

            ZwClose(hFile);
        }
    }
}

В чем ошибка? или работу с файлами из этой функции вызывать нельзя?

KbFilter_ServiceCallback runs in kernel mode at IRQL DISPATCH_LEVEL.
Callers of ZwOpenFile must be running at IRQL = PASSIVE_LEVEL.
Похоже проблема в этом....Каким образом можно это обойти.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.