В чем смысл переменной: IoDeviceObjectType

Тема в разделе "WASM.NT.KERNEL", создана пользователем profile003, 7 ноя 2007.

  1. profile003

    profile003 New Member

    Публикаций:
    0
    Регистрация:
    30 сен 2007
    Сообщения:
    16
    Нужно получить указатель на DriverObject по имени драйвера, использую:

    ObReferenceObjectByName(&szLinkPath, OBJ_CASE_INSENSITIVE, NULL, 0,
    *IoDeviceObjectType, KernelMode, NULL, &lpDeviceObject);

    но не знаю что значит экспортируемая переменная: IoDeviceObjectType, если на ее место поставить NULL, то будет ошибка, от чего зависит значение этой переменной?
    В одном из драйверов она равна: 805509e0h, вроде указывает куда-то в ntoskrnl.exe

    P.S.
    вообще то пишу на fasm'е пример привел для краткости
     
  2. profile003

    profile003 New Member

    Публикаций:
    0
    Регистрация:
    30 сен 2007
    Сообщения:
    16
    P.S.
    вообще то пишу на fasm'е пример привел для краткости
     
  3. profile003

    profile003 New Member

    Публикаций:
    0
    Регистрация:
    30 сен 2007
    Сообщения:
    16
    Большая слава ЯЙЦАМ!!! нашел ошибку!!!
    ну все же интересно узнать ша за переменная такая?
     
  4. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Эта переменная определяет тип объекта, вот список:

    POBJECT_TYPE *ExEventPairObjectType;
    POBJECT_TYPE *PsProcessType;
    POBJECT_TYPE *PsThreadType;
    POBJECT_TYPE *PsJobType;
    POBJECT_TYPE *LpcPortObjectType;
    POBJECT_TYPE *LpcWaitablePortObjectType;
    POBJECT_TYPE *IoDriverObjectType;
    POBJECT_TYPE *IoDeviceObjectType;
    POBJECT_TYPE *MmSectionObjectType;
     
  5. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Это указатель на OBJECT_TYPE - структура, описывающая тип объекта и содержащая необходимые функции и значения для создания, удаления, парсинга данного типа объектов.
    typedef struct _OBJECT_TYPE {
    ERESOURCE Mutex;
    LIST_ENTRY TypeList;
    UNICODE_STRING Name;
    PVOID DefaultObject;
    ULONG Index;
    ULONG TotalNumberOfObjects;
    ULONG TotalNumberOfHandles;
    ULONG HighWaterNumberOfObjects;
    ULONG HighWaterNumberOfHandles;
    OBJECT_TYPE_INITIALIZER TypeInfo;
    } OBJECT_TYPE, *POBJECT_TYPE;

    и главное там - OBJECT_TYPE_INITIALIZER, структура, которая передается в функцию ObCreateObjectType:
    typedef struct _OBJECT_TYPE_INITIALIZER {
    USHORT Length;
    BOOLEAN UseDefaultObject;
    BOOLEAN Reserved;
    ULONG InvalidAttributes;
    GENERIC_MAPPING GenericMapping;
    ULONG ValidAccessMask;
    BOOLEAN SecurityRequired;
    BOOLEAN MaintainHandleCount;
    BOOLEAN MaintainTypeList;
    POOL_TYPE PoolType;
    ULONG DefaultPagedPoolCharge;
    ULONG DefaultNonPagedPoolCharge;
    OB_DUMP_METHOD DumpProcedure;
    OB_OPEN_METHOD OpenProcedure;
    OB_CLOSE_METHOD CloseProcedure;
    OB_DELETE_METHOD DeleteProcedure;
    OB_PARSE_METHOD ParseProcedure;
    OB_SECURITY_METHOD SecurityProcedure;
    OB_QUERYNAME_METHOD QueryNameProcedure;
    OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
    } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
     
  6. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Deyton
    Еще есть IoFileObjectType и CmpKeyType (для файлов и реестра соответственно, причем IoFileObjectType экспортируется, тогда как CmpKeyType не экспортируется)
     
  7. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    К тому же, IoFileObjectType->ParseProcedure не делает ничего, кроме проверки пары параметров на валидность - после этого передает вызов в IoDeviceObjectType->ParseProcedure, которая парсит переданое имя и уже делает все дальнейшие операции (в зависимости от значений в OPEN_PACKET или вызывает обработчики IRP девайса или вызывает FastIo для FastIoOpenQuery/FastIoOpenQueryNetworkInfo - это в случае удачного парсинга, или вызывает самое себя в случае STATUS_NEED_REPARSE или ничего если ошибка).
     
  8. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Ну тогдя и я добавлю свои 5 копеек, как найти то что не экспортируется :)

    Код (Text):
    1. POBJECT_TYPE CmpKeyObjectType;
    2.  
    3. NTSTATUS InitObjectType()
    4. {
    5.     OBJECT_ATTRIBUTES objectAttributes = {0};
    6.     HANDLE runKey = NULL;
    7.     NTSTATUS ntStatus;
    8.  
    9.     UNICODE_STRING RegistryPath;
    10.     UNICODE_STRING RegistryValue;
    11.     WCHAR Value[MAX_PATH];
    12.  
    13.     PCM_KEY_BODY        KeyBody;
    14.  
    15.     RtlInitUnicodeString(&RegistryPath, L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
    16.    
    17.     InitializeObjectAttributes(&objectAttributes,
    18.         &RegistryPath,
    19.         OBJ_CASE_INSENSITIVE,
    20.         NULL,
    21.         NULL);
    22.  
    23.     ntStatus = ZwOpenKey(&runKey,
    24.         KEY_ALL_ACCESS,
    25.         &objectAttributes);
    26.  
    27.     if(!NT_SUCCESS(ntStatus))
    28.     {
    29.         return ntStatus;
    30.     }
    31.  
    32.     ntStatus = ObReferenceObjectByHandle(runKey,
    33.         0,
    34.         NULL,
    35.         KernelMode,
    36.         (PVOID *)(&KeyBody),
    37.         NULL);
    38.  
    39.  
    40.     if(NT_SUCCESS(ntStatus))
    41.     {
    42.         POBJECT_HEADER obHeader = OBJECT_TO_OBJECT_HEADER((PVOID)KeyBody);
    43.  
    44.         CmpKeyObjectType = obHeader->ObjectType;
    45.  
    46.         ObDereferenceObject(KeyBody);
    47.     }  
    48.    
    49.     ZwClose(runKey);
    50.  
    51.     return ntStatus;
    52. }
     
  9. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Да - единственная проблема, что PsProcessType & PsThreadType не имеют OpenProcedure/ParseProcedure и для хуков не представляют интереса, хотя имеют процедуру DeleteProcedure - которая иногда тоже полезной может быть :)
    Существует еще IoSymbolicLinkObjectType - если хукнуть имеющуюся там ParseProcedure, винда спустя несколько мгновений валится в синяк (причина - особенности парсинга данного типа объектов, в виду того, что сравнивается ->ParseProcedure и фиксированный адрес, хотя это можно сплайсингом обойти). В принципе, SymbolicLinkObjectType->TypeInfo->ParseProcedure вызывается практически при любом вызове Object Manager.
     
  10. DriversDeveloper

    DriversDeveloper Виктор Фисюк

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    6
    Адрес:
    Kiev, Ukraine
    .

    Хоть они и не имеют данных методов, но этим типам можно записать свое значение OpenProcedure, тогда при открытии объектов данных типов, наша функция будет вызыватся.

    Указатель на любой объект-тип (IoFileObjectType, CmpKeyType или любой другой) можно получить, если открыть соответствующий объект в директории \ObjectTypes\ с помощью ObReferenceObjectByName (например, \ObjectTypes\File, \ObjectTypes\Key и т.д.).