Как получить список задействованных драйверов при помощи WinDbg?

Тема в разделе "WASM.NT.KERNEL", создана пользователем flammmable, 17 янв 2023.

  1. flammmable

    flammmable New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2023
    Сообщения:
    6
    В статье Майкрософта есть такая картинка:

    [​IMG]

    Я хотел бы получить подобный стек/список драйверов, задействованных в работе конкретного устройства. Здесь, на WASM, посоветовали использовать для получения данного стека утилиту WinDbg. Я спросил на StackOverflow, как это сделать и там мне сказали, что это возможно при помощи команды "!devstack" (есть сомнения, что это то, что нужно, но это - ладно). Команде "!devstack" требуется идентификатор устройства. Я не вполне понимаю, где его взять. Я попробовал поискать в выпадающем списке "Свойство", который находится через "Диспетчер устройств->[моё устройство]->Свойства->Сведения". Но не нашёл там ничего подходящего. Я попробовал через AIDA64 - тоже не нашёл. Наверняка это можно сделать через сам WinDbg - но я также не нашёл подходящей команды. Я нашёл, что USB-сниффер USBlyzer в окне "Device Stack" выдаёт нечто похожее на идентификаторы из примеров использования "!devstack".

    В WinDbg я открыл редактор (командную строку?) через "File->Kernel Debug->Local". И ввёл там "!devstack 0xFFFF-блаблабла" с идентификатором, взятым из USBlyzer-а. Но WinDbg сказал:
    "Could not read Type from DeviceObject 0xFFFF-блаблабла"

    Вопрос. Кто-нибудь может рассказать по шагам, как получить список драйверов, к примеру, навороченной Logitec-овской мыши при помощи WinDbg? Без фигни в духе:
    1) Не, а там, на самом деле всё очень просто, берёшь WinDbg, открываешь его, и там, в принципе всё понятно, очевидно и удобно. А если что, там есть справка.
    2) Там же этот, как его, mouclass.sys, вот это - драйвер. А зачем вам стек-то, я не пойму? Вы расскажите, какую задачу решаете? Постановку, ТЗ.
    3) Это тебе надо для начала прочитать 100500 страниц "Работа с ядром Windows" Павла Йосифовича. Там всё есть.
     
    Последнее редактирование: 17 янв 2023
  2. x0rum

    x0rum New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2021
    Сообщения:
    20
    Windows Internals (PDF):
    https://repo.zenk-security.com/Linu...ions/Windows Internals Part 2_6th Edition.pdf

    В этой книге два раза встречается !devstack:

    1.
    > EXPERIMENT: Viewing a Device Stack
    > lkd> !devstack keyboardclass0

    ...

    2.
    > EXPERIMENT: Looking at Microsoft Shadow Copy Provider Filter Device Objects
    1: kd> !devstack 88cfd908


    В первом случае используется имя устройства keyboardclass0
    Во втором - [виртуальный] адрес объекта DEVICE_OBJECT, который выделяется один раз при загрузке
    драйвера (включении винды).

    Могу сказать, что список зарегистрированых Device-ов (т..е DEVICE_OBJECT-ов, но специалисты могут поправить меня) можно посмотреть програмулинкой
    WinObjEx64 https://github.com/hfiref0x/WinObjEx64

    Можешь попробовать имена данных девайсов попередавать

    Ваще тут по-любому должны быть люди, способные разжевать детально. Ау, люди.
     
    flammmable нравится это.
  3. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    198
    Да вроде всё тут прозрачно..
    Имеем произвольный драйвер, который может обслуживать сразу несколько устройств одного класса.
    Для каждого из устройств, чз IoCreateDevice() драйвер создаёт структуру DEVICE_OBJECT. Структуру-же самого драйвера DRIVER_OBJECT, создаёт системный диспетчер в/в, и передаёт на неё указатель в функцию DriverEntry(). Внутри этой функции, драйвер заполняет некоторые поля своей структуры, прописывая в них адреса обработчиков IRP_MJ_xx.

    Код (Text):
    1. 0: kd> dt _driver_object
    2. ---------------------------
    3. ntdll!_DRIVER_OBJECT
    4.    +0x000 Type             : Int2B
    5.    +0x002 Size             : Int2B
    6.    +0x008 DeviceObject     : Ptr64 _DEVICE_OBJECT  <--- объект устройства
    7.    +0x010 Flags            : Uint4B
    8.    +0x018 DriverStart      : Ptr64 Void
    9.    +0x020 DriverSize       : Uint4B
    10.    +0x028 DriverSection    : Ptr64 Void
    11.    +0x030 DriverExtension  : Ptr64 _DRIVER_EXTENSION
    12.    +0x038 DriverName       : _UNICODE_STRING
    13.    +0x048 HardwareDatabase : Ptr64 _UNICODE_STRING
    14.    +0x050 FastIoDispatch   : Ptr64 _FAST_IO_DISPATCH
    15.    +0x058 DriverInit       : Ptr64     long      <----- прописать линк на процедуру инициализации
    16.    +0x060 DriverStartIo    : Ptr64     void
    17.    +0x068 DriverUnload     : Ptr64     void      <----- линк на процедуру выгрузки из памяти
    18.    +0x070 MajorFunction    : [28] Ptr64     long
    19.  
    20. 0: kd> dt _device_object
    21. ---------------------------
    22. ntdll!_DEVICE_OBJECT
    23.    +0x000 Type                  : Int2B
    24.    +0x002 Size                  : Uint2B
    25.    +0x004 ReferenceCount        : Int4B
    26.    +0x008 DriverObject          : Ptr64 _DRIVER_OBJECT  <--- родитель
    27.    +0x010 NextDevice            : Ptr64 _DEVICE_OBJECT  <--- нижнее  устройство в стеке драйверов
    28.    +0x018 AttachedDevice        : Ptr64 _DEVICE_OBJECT  <--- верхнее устройство в стеке драйверов
    29.    +0x020 CurrentIrp            : Ptr64 _IRP            <--- текущий пакет IRP
    30.    +0x028 Timer                 : Ptr64 _IO_TIMER
    31.    +0x030 Flags                 : Uint4B
    32.    +0x034 Characteristics       : Uint4B
    33.    +0x038 Vpb                   : Ptr64 _VPB
    34.    +0x040 DeviceExtension       : Ptr64 Void
    35.    +0x048 DeviceType            : Uint4B
    36.    +0x04c StackSize             : Char
    37.    +0x050 Queue                 : <unnamed-tag>
    38.    +0x098 AlignmentRequirement  : Uint4B
    39.    +0x0a0 DeviceQueue           : _KDEVICE_QUEUE
    40.    +0x0c8 Dpc                   : _KDPC
    41.    +0x108 ActiveThreadCount     : Uint4B
    42.    +0x110 SecurityDescriptor    : Ptr64 Void
    43.    +0x118 DeviceLock            : _KEVENT
    44.    +0x130 SectorSize            : Uint2B
    45.    +0x132 Spare1                : Uint2B
    46.    +0x138 DeviceObjectExtension : Ptr64 _DEVOBJ_EXTENSION
    47.    +0x140 Reserved              : Ptr64 Void
    48. 0: kd>
    Таким образом, чтобы просмотреть стек-драйверов,
    нужно сначала получить в WinDbg структуру конкретного драйвера командой !drvobj:

    Код (Text):
    1. 0: kd> !drvobj disk
    2. ---------------------------------------
    3. Driver object (fffffa80027a1670) is for:  \Driver\Disk
    4. Driver Extension List: (id , addr)
    5. (fffff880019c38c0 fffffa80027a2020)
    6.  
    7. Device Object list:
    8. fffffa80023e8790  fffffa80027a5060  fffffa80027a3790
    Как видим, драйвер disk.sys создал 3 девайса,
    а WinDbg возвратил лист указателей на их структуры DEVICE_OBJECT.
    Теперь имеем адреса, и можно передать их команде отладчика !devstack:

    Код (Text):
    1. 0: kd> !devstack fffffa80023e8790
    2. ---------------------------------------
    3.   !DevObj           !DrvObj            !DevExt           ObjectName
    4.   fffffa8002282040  \Driver\partmgr    fffffa8002282190
    5. > fffffa80023e8790  \Driver\Disk       fffffa80023e88e0  DR4
    6.   fffffa8003f76b30  \Driver\secnvmeF   fffffa8003f76c80
    7.   fffffa80024cb040  \Driver\IaNVMeF    fffffa80024cb190
    8.   fffffa800259b4c0  \Driver\USBSTOR    fffffa800259b610  00000081
    9.  
    10. !DevNode fffffa80023f02b0:
    11.   DeviceInst is "USBSTOR\Disk&Ven_ADATA&Prod_USB_Flash_Drive&Rev_0.00\0000000FEA63A5&0"
    12.   ServiceName is "disk"
    При желании можно просмотреть основную информацию из структуры DEVICE_OBJECT,
    а не её позицию в стеке драйверов - это команда !devobj:

    Код (Text):
    1. 0: kd> !devobj fffffa80023e8790
    2. ---------------------------------------
    3. Device object (fffffa80023e8790) is for:  DR4 \Driver\Disk DriverObject fffffa80027a1670
    4. Current Irp 00000000. RefCount 0. Type 00000007. Flags 01002050
    5. Vpb fffffa80023e1aa0. Dacl fffff9a1050a95d0. DevExt fffffa80023e88e0. DevObjExt fffffa80023e8f88. Dope fffffa8001f2e6e0.
    6. ExtensionFlags (0x00000800) Unknown flags 0x00000800
    7.  
    8. AttachedDevice (Upper) fffffa8002282040 \Driver\partmgr
    9. AttachedTo     (Lower) fffffa8003f76b30 \Driver\secnvmeF
    10. Device queue is not busy.
     
    flammmable, UbIvItS и Mikl___ нравится это.
  4. RCE

    RCE Member

    Публикаций:
    2
    Регистрация:
    22 сен 2022
    Сообщения:
    41
  5. flammmable

    flammmable New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2023
    Сообщения:
    6
    Огромное всем спасибо!