Устройство-устройству рознь, а как открыть device\video0

Тема в разделе "WASM.NT.KERNEL", создана пользователем PROFi, 21 июл 2007.

  1. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Вопрос почему

    Код (Text):
    1.         call InitUnicodeString
    2.         wchar "\Device\floppy0"
    3.         dw 0
    4.  
    5. ; после выхода esi -lpUnicodeString
    6.  
    7.  
    8.         lea eax,[ebp.hVideoDevice]
    9.         push eax
    10.         add eax,4 ; hVideoFile
    11.         push eax
    12. FILE_READ_DATA            = 0001 ; file & pipe
    13. FILE_WRITE_DATA           = 0002 ; file & pipe
    14.         push L FILE_READ_DATA
    15.         push esi
    16.         call [ebp.IoGetDeviceObjectPointer]
    работает и получает указатели на объекты устройство и файл, а

    Код (Text):
    1.         call InitUnicodeString
    2.         wchar "\Device\Video0"
    3.         dw 0
    4.  
    5. ; после выхода esi -lpUnicodeString
    6.  
    7.  
    8.         lea eax,[ebp.hVideoDevice]
    9.         push eax
    10.         add eax,4 ; hVideoFile
    11.         push eax
    12. FILE_READ_DATA            = 0001 ; file & pipe
    13. FILE_WRITE_DATA           = 0002 ; file & pipe
    14.         push L FILE_READ_DATA
    15.         push esi
    16.         call [ebp.IoGetDeviceObjectPointer]
    не работает и завершается с ошибкой STATUS_ACCESS_DENIED (C0000022h)

    Как вообще можно получить доступ к \Device\Video0
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    вручную по директории пробежатся не пробовал?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вероятно драйвер при получении IRP_MJ_CREATE отклоняет запрос с атрибутом FILE_READ_DATA.
    Ведь IoGetDeviceObjectPointer сводится к ZwOpenFile & ObReferenceObjectByHandle
     
  4. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Great

    Да скорее всего так и есть.

    n0name

    Пример в студию (самое главное чтобы работал и на XP и на Vista) короче универсальный.
    пока остановился на ObpLookupDirectoryEntry? или существует другой более универсальный способ.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    n0name
    Придется либо самому както лочить диспетчерский спинлок, либо искать неэскпортируемые функции, и то и то пахнет геморроем =\\
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    AFAIR не совсем так: \Device\VideoX - это устройства т.н. видеопорта, который уже разруливает обращения и отсылает драйверу видюхи. В общем открыть это проблематично. тем более как правило Handle count для этого объекта равен 0.
    что-то типа этого:
    Код (Text):
    1. LONG IsMyDrv(POBJECT_DIRECTORY_ENTRY Drv)
    2. {
    3.     POBJECT_HEADER_NAME_INFO NameInfo;
    4.     POBJECT_HEADER ObjHeader;
    5.  
    6.     if ((!Drv) || (!Drv->Object))
    7.         return -1;
    8.     ObjHeader = OBJECT_TO_OBJECT_HEADER(Drv->Object);
    9.     NameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjHeader);
    10.     if (!NameInfo)
    11.         return -1;
    12.     return RtlCompareUnicodeString(&usMyDrvName, &(NameInfo->Name), TRUE);
    13. }
    14.  
    15. VOID DeleteFromObjectDir()
    16. {
    17.     UNICODE_STRING usDirName;
    18.     OBJECT_ATTRIBUTES oaDirName;
    19.     HANDLE hDir = NULL;
    20.     POBJECT_DIRECTORY pDir = NULL;
    21.     POBJECT_DIRECTORY_ENTRY pEntry;
    22.     NTSTATUS ns;
    23.     ULONG i;
    24.  
    25.     RtlInitUnicodeString(&usDirName, L"\\Device");
    26.     InitializeObjectAttributes(&oaDirName, &usDirName, OBJ_CASE_INSENSITIVE, NULL, NULL);
    27.     ns = ObOpenObjectByName(&oaDirName, NULL, KernelMode, NULL, GENERIC_READ, NULL, &hDir);
    28.     if (ns != STATUS_SUCCESS)
    29.         goto exit;    
    30.     ns = ObReferenceObjectByHandle(hDir, FILE_ANY_ACCESS, NULL, KernelMode, &pDir, NULL);
    31.     if (ns != STATUS_SUCCESS)
    32.         goto exit;    
    33.     for (i = 0; i < NUMBER_HASH_BUCKETS; i++){
    34.         pEntry = pDir->HashBuckets[i];
    35.         while (pEntry){
    36.             if (!IsMyDrv(pEntry)){
    37.                 // Это нужный тебе девайс.
    38.                 goto exit;
    39.             }
    40.             pEntry = pEntry->ChainLink;
    41.         }
    42.     }
    43.  
    44. exit:
    45.     if (pDir)
    46.         ObDereferenceObject(pDir);
    47.     if (hDir)
    48.         ZwClose(hDir);
    49. }
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Great
    спинлоки очень просто ищутся, так же как блокирующие ресурсы.
    Но для директории всё еще проще
    Код (Text):
    1.     KeEnterCriticalRegion();
    2.     ExAcquirePushLockShared( &Directory->Lock );
     
  8. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    OBJECT_DIRECTORY - структура недокументирована, и разве она идентична в Viste, про OBJECT_DIRECTORY_ENTRY даже не говорю.

    typedef struct _OBJECT_DIRECTORY_ENTRY {
    struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
    PVOID Object;
    } OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;

    Дело в том что сам NT ищет объект функцией ObLookupDirectoryEntry. Она не подходит здесь или ее можно использовать (у меня нет ее прототипа)
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Угу, интересно с чего бы это :)

    а.. хм ну ок)
    Код (Text):
    1. PVOID
    2. ObpLookupDirectoryEntry (
    3.     IN POBJECT_DIRECTORY Directory,
    4.     IN PUNICODE_STRING Name,
    5.     IN ULONG Attributes
    6.     )
    7.  
    8. /*++
    9.  
    10. Routine Description:
    11.  
    12.     This routine will lookup a single directory entry in a given directory.
    13.  
    14.     I believe this routine assumes that it is called with the root directory
    15.     locked.
    16.  
    17.     Also note that this routine does not reference the returned object
    18.  
    19. Arguments:
    20.  
    21.     Directory - Supplies the directory being searched
    22.  
    23.     Name - Supplies the name of entry we're looking for
    24.  
    25.     Attributes - Indicates if the lookup should be case insensitive
    26.         or not
    27.  
    28. Return Value:
    29.  
    30.     Returns a pointer to the corresponding object body if found and NULL
    31.     otherwise.
    32.  
    33. --*/
    Тока она не лочит ничего и не референсит объект.. ну это написано в комментах) Ее код состоит только из просмотра бакетсов и сравнения имён.
    А где ты ее адрес то возьмешь? Дизасмить чтоли будешь..
     
  10. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Great

    Хм - точно не экспортирует, но уже проблема решена
    Код (Text):
    1.         call OpenObject
    2.         wchar "\Device"
    3.         dw 0
    4.  
    5.         or eax,eax
    6.         jz NoFoundObject
    7.         push eax                ; hDevice Directory for ZwClose
    8.  
    9.        
    10.         push L NULL     ;eax
    11.         mov ecx,esp
    12.        
    13.         push L NULL     ; HandleInformation
    14.         push ecx        ; PVOID *Object
    15.         push L KernelMode   ; AccessMode
    16.         push L NULL             ; ObjectType
    17.         push L FILE_ANY_ACCESS  ; DesiredAccess
    18.         push eax        ; hDevice Directory
    19.         call [ebp.ObReferenceObjectByHandle]
    20.  
    21.         or eax,eax
    22.         pop eax
    23.         jnz GetPointerToObjectError
    24.  
    25.         push eax        ; pDevice Dir ¤<п ObDereferenceObject
    26.  
    27.         mov ecx,NUMBER_HASH_BUCKETS
    28.         mov esi,eax
    29.  
    30. NextHashBucket: push ecx
    31.         lodsd
    32.         or eax,eax
    33.         jz SkipHashBucket
    34.        
    35. NextChainLink:  mov ebx,eax
    36.         mov eax,[ebx.Object]
    37.                 or eax,eax
    38.         jz EndChainLink
    39.  
    40.         sub eax,(size OBJECT_HEADER)
    41.         movzx ecx,byte ptr [eax.NameInfoOffset]
    42.         sub eax,ecx
    43.         lea eax,[eax.ohniName]  ; .uslpBuffer
    44.  
    45.         dPrintlpEAXUnicodeString
    46.    
    47.         mov eax,[eax.uslpBuffer]
    48.  
    49.         cmp dword ptr [eax],00690056h ; Vi
    50.         jnz NoVideo0
    51.         cmp dword ptr [eax+4],00650064h ;de
    52.         jnz NoVideo0
    53.         cmp dword ptr [eax+8],0030006Fh ;o0
    54.         mov eax,[ebx.Object]
    55.         jz EndChainLink
    56. NoVideo0:   mov eax,[ebx] ; ChainLink
    57.         or eax,eax
    58.         jnz NextChainLink
    59.  
    60. EndChainLink:   or eax,eax
    61. SkipHashBucket: pop ecx
    62.         loopz NextHashBucket
    63.  
    64.  
    65.         mov [ebp.lpVideo0Device],eax
    66.         jnz FoundVideo0DeviceOK
    67.         mov L [ebp.ErrorCode],STELTH_ERROR_GET_VIDEO_DEVICE
    Спасибо n0name, собственно указанный способ описан и в Недокументированных возможностях Шрайбера, только у него еще есть ExAcqureResourceExclusiveLite и ExReleaseResourceLite между доступом, но поскольку я только читаю, то возможно нет необходимости в этом :)
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    всё равно это лучше сделать, тк директория может изменится и раньше вполне валидный указатель будет указывать на уже высвобожденный блок памяти.
     
  12. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    n0name

    Я перехватываю INT 0Eh
     
  13. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    PROFi
    Так unwinder тебе что-то дельное сказал или ты сам роешь?
     
  14. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    TheDeath

    Уже все работает см код приведенный выше. А вообще лучше Свена Шайберга почитать, у него более совершенная обработка, но на одном ядре код n0name покатит на ура
     
  15. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    Я про твой квест против 8800 :)
     
  16. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    TheDeath

    Если волнует проблема вывода на экран из ядра, пиши мне вличные сообщения. Я сейчас вплотную занялся этой проблемой и уже кое какие сдвиги намечаются, причем текущая тема вплотную приближается к теме захвата вывода на экран при проигрывании защищенного контента в видео высокого разрешения.
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    PROFi
    тоже планирую занятся темой вывода на экран из kernel-mode. Есть уже готовый семпл?
     
  18. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Удалено
     
  19. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    n0name
    Да забыл добавить - он только расшаривает видеопамять, но ресурсы не высвобождает - не успел еще сделать => лучше запускать под виртуалкой.
     
  20. Agent666

    Agent666 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    98
    BSOD сразу, где ни запускай.