Получение имени устройства по указателю PDEVICE_OBJECT
От: eight Россия  
Дата: 31.08.14 15:01
Оценка:
Добрый день. Столкнулся со следующими вопросами, ответить на которые сам не могу.

1. Как получить имя устройства если известен указатель PDEVICE_OBJECT?
2. Каким образом в ядре можно перечислить все устройства(DEVICE_OBJECT) или драйвера (DRIVER_OBJECT)?
3. Нужно получить указатель на device_object но он не всегда тот что нужен. см. ниже.

PDEVICE_OBJECT DeviceObject = GetDeviceObject(dev_name, &pfile);
    
if (DeviceObject)
{
    // 2. Get pointer to the lowest device in stack
    DeviceObject = GetLowestDevice(DeviceObject);
    // for( move_to device with flag DO_DEVICE_HAS_NAME)
}
// ...

PDEVICE_OBJECT GetLowestDevice(__in PDEVICE_OBJECT DeviceObject)
{
    PDEVICE_OBJECT pLowestDevice = DeviceObject;
    PDEVOBJ_EXTENSION deviceExtension = pLowestDevice->DeviceObjectExtension;
    while (deviceExtension->AttachedTo)
    {
        /* Gets the lowest device and its extension */
        pLowestDevice = deviceExtension->AttachedTo;
        deviceExtension = pLowestDevice->DeviceObjectExtension;
    }

    return pLowestDevice;
}


GetDeviceName возвращает указатель на устройство с использованием IoGetDeviceObjectPointer, а в таком случае это самый верхний девайс и не всегда тот который нужен. Поэтому использую GetLowestDevice чтобы пропустить все приаттаченные устройства. Но опять же и тут тоже не всё так классно так как нижнее устройство может быть не тем, что ожидалось. Вот тут то мне и требуется дополнительная проверка с именем устройства по указателю на PDEVICE_OBJECT.. I have no idea как это решить.
Отредактировано 31.08.2014 20:02 eight . Предыдущая версия .
Re: Получение имени устройства по указателю PDEVICE_OBJECT
От: EreTIk EreTIk's Box
Дата: 01.09.14 09:34
Оценка:
E>1. Как получить имя устройства если известен указатель PDEVICE_OBJECT?
Так же как и для других честных объектов ядра: ObQueryNameString(...)

E>2. Каким образом в ядре можно перечислить все устройства(DEVICE_OBJECT) или драйвера (DRIVER_OBJECT)?

Перечислив все драйвера можно воспользоваться вызовом IoEnumerateDeviceObjectList(...).
Для перечисления драйверов можно перечислить элементы дерева объектов в \Driver и \FileSystem. Но ядром экспортируется недокументированная функция nt!IoCreateDriver, позволяющая создавать объект драйвера в любом месте иерархии дерева объектов ядра.

E>3. Нужно получить указатель на device_object но он не всегда тот что нужен. см. ниже.

E>
E>PDEVICE_OBJECT DeviceObject = GetDeviceObject(dev_name, &pfile);
...
E>

E>GetDeviceName возвращает указатель на устройство с использованием IoGetDeviceObjectPointer
В листинге нет упоминания GetDeviceName, допустим речь идет про GetDeviceObject

E> ... I have no idea как это решить.

Не очень понял как пересекаются задачи перечисления всех объектов устройств и поиска конкретного объекта в стеке устройств? Что за глобальная задача решается?
Re[2]: Получение имени устройства по указателю PDEVICE_OBJECT
От: eight Россия  
Дата: 02.09.14 10:44
Оценка:
Здравствуйте, EreTIk, Вы писали:

E>>1. Как получить имя устройства если известен указатель PDEVICE_OBJECT?

ETI>Так же как и для других честных объектов ядра: ObQueryNameString(...)
Большое спасибо, опробую!

E>>2. Каким образом в ядре можно перечислить все устройства(DEVICE_OBJECT) или драйвера (DRIVER_OBJECT)?

ETI>Перечислив все драйвера можно воспользоваться вызовом IoEnumerateDeviceObjectList(...).
ETI>Для перечисления драйверов можно перечислить элементы дерева объектов в \Driver и \FileSystem. Но ядром экспортируется недокументированная функция nt!IoCreateDriver, позволяющая создавать объект драйвера в любом месте иерархии дерева объектов ядра.
Ок, спасибо это я смогу сделать при помощи ZwQueryDirectoryObject.

ETI>В листинге нет упоминания GetDeviceName, допустим речь идет про GetDeviceObject

Да, это опечатка, прошу прощения. Имелось ввиду GetDeviceObject.

ETI>Не очень понял как пересекаются задачи перечисления всех объектов устройств и поиска конкретного объекта в стеке устройств? Что за глобальная задача решается?

Пишется драйвер для секьюрити приложения, есть несколько подзадач — снять хуки у обработчиков IRP, для этого нужно найти конкретное устройство в иерархии. Сейчас проверяется целостность обработчиков каждого подключённого устройства. Ну и так же требуется предоставлять список устройств выше указанного.
Re[3]: Получение имени устройства по указателю PDEVICE_OBJECT
От: EreTIk EreTIk's Box
Дата: 02.09.14 11:16
Оценка:
ETI>>Не очень понял как пересекаются задачи перечисления всех объектов устройств и поиска конкретного объекта в стеке устройств? Что за глобальная задача решается?
E>Пишется драйвер для секьюрити приложения, есть несколько подзадач — снять хуки у обработчиков IRP, для этого нужно найти конкретное устройство в иерархии. Сейчас проверяется целостность обработчиков каждого подключённого устройства. Ну и так же требуется предоставлять список устройств выше указанного.
Зачем для этих целей перечилять все объекты в системе устройств для меня так и осталось загадкой.
P.S. Может в листинге из первого сообщения это пропущено, но функция GetLowestDevice должна синхронизировать доступ к списку DEVOBJ_EXTENSION::AttachedTo
    irql = KeAcquireQueuedSpinLock( LockQueueIoDatabaseLock );
    ...
    KeReleaseQueuedSpinLock( LockQueueIoDatabaseLock, irql );
Re[4]: Получение имени устройства по указателю PDEVICE_OBJECT
От: eight Россия  
Дата: 02.09.14 19:06
Оценка:
Здравствуйте, EreTIk, Вы писали:

ETI>P.S. Может в листинге из первого сообщения это пропущено, но функция GetLowestDevice должна синхронизировать доступ к списку DEVOBJ_EXTENSION::AttachedTo

ETI>
ETI>    irql = KeAcquireQueuedSpinLock( LockQueueIoDatabaseLock );
ETI>    ...
ETI>    KeReleaseQueuedSpinLock( LockQueueIoDatabaseLock, irql );
ETI>


Нет, никаких блокировок не захватывал.

Вот ещё что-то из разряда мистики, пойму что не так делаю.
Ниже представлен лог.

1) Первый вызов
00000081 18.49023056 cl0: IOCTL_ATTACHED_DEVICES to \Device\RawDisk
00000082 18.49023438 cl0: DEVNAME = \Device\RawDisk
00000083 18.49025536 cl0: level=0 pDeviceObject=0x85c35308 Characteristics=0x0 DeviceType=0x8 Flags=0x50
00000085 18.49027443 cl0: DriverName=.sys FilePath=ystem32\wpdshext.dll,-701 ImageBase=0x6f006f ImageSize=0x73005c DeviceObject=0x85c35308
00000086 18.49027824 cl0: level=1 pDeviceObject=0x86909660 Characteristics=0x0 DeviceType=0x8 Flags=0x10
00000088 18.49028778 cl0: DriverName=\FileSystem\FltMgr FilePath=\SystemRoot\system32\drivers\fltmgr.sys ImageBase=0x8a72d000 ImageSize=0x34000 DeviceObject=0x86909660

2) Второй вызов
IOCTL_ATTACHED_DEVICES to \Device\RawDisk
00000188 221.15068054 cl0: DEVNAME = cl0: level=0 pDeviceObject=0x85c35308 Characteristics=0x0 DeviceType=0x8 Flags=0x50
00000190 221.15068054 cl0: DriverName=iz.dll FilePath=msvcrt.dll-downlevel-advapi32-l1-1-0.dll? ImageBase=0x650074 ImageSize=0x5c0032 DeviceObject=0x85c35308
00000191 221.15068054 cl0: level=1 pDeviceObject=0x86909660 Characteristics=0x0 DeviceType=0x8 Flags=0x10
00000193 221.15069580 cl0: DriverName=\FileSystem\FltMgr FilePath=\SystemRoot\system32\drivers\fltmgr.sys ImageBase=0x8a72d000 ImageSize=0x34000 DeviceObject=0x86909660

Два одинаковых вызова дают совершенно разные результаты. Мало того что в driver_name находится мусор, так он ещё и разный. Я так подозреваю тут какие-то блокировки нужно было захватить. Я же просто передаю в функцию указатель на DRIVER_OBJECT и просто читает информацию о драйвере.

PLDR_DATA_TABLE_ENTRY pldr_drv = (PLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection;


Получается, что я не захватил какую-то блокировку перед обращением к списку?
Re[5]: Получение имени устройства по указателю PDEVICE_OBJECT
От: EreTIk EreTIk's Box
Дата: 03.09.14 09:11
Оценка:
E>00000085 18.49027443 cl0: DriverName=.sys FilePath=ystem32\wpdshext.dll,-701 ImageBase=0x6f006f ImageSize=0x73005c DeviceObject=0x85c35308
E>...
E>00000190 221.15068054 cl0: DriverName=iz.dll FilePath=msvcrt.dll-downlevel-advapi32-l1-1-0.dll? ImageBase=0x650074 ImageSize=0x5c0032 DeviceObject=0x85c35308
E>...
E>Два одинаковых вызова дают совершенно разные результаты. Мало того что в driver_name находится мусор, так он ещё и разный. Я так подозреваю тут какие-то блокировки нужно было захватить. Я же просто передаю в функцию указатель на DRIVER_OBJECT и просто читает информацию о драйвере.
E>
E>PLDR_DATA_TABLE_ENTRY pldr_drv = (PLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection;
E>

E>Получается, что я не захватил какую-то блокировку перед обращением к списку?

Возможно вы удивитесь но по логам другого человека, не видя код, который их пишет, сказать можно не так много. Читайте свои посты, перед тем как их отправлять. Откуда я могу знать как и откуда вы читаете строку, которую потом печатаете с префиксом DriverName

Маловероятно, что это связано с блокировкой. По приведенной строчке можно сразу сказать, что _LDR_DATA_TABLE_ENTRY и _KLDR_DATA_TABLE_ENTRY это разные структуры. В _DRIVER_OBJECT::DriverSection заполняется указатель на _KLDR_DATA_TABLE_ENTRY.
Re[6]: Получение имени устройства по указателю PDEVICE_OBJECT
От: eight Россия  
Дата: 03.09.14 12:23
Оценка:
ETI>Возможно вы удивитесь но по логам другого человека, не видя код, который их пишет, сказать можно не так много. Читайте свои посты, перед тем как их отправлять. Откуда я могу знать как и откуда вы читаете строку, которую потом печатаете с префиксом DriverName

ETI>Маловероятно, что это связано с блокировкой. По приведенной строчке можно сразу сказать, что _LDR_DATA_TABLE_ENTRY и _KLDR_DATA_TABLE_ENTRY это разные структуры. В _DRIVER_OBJECT::DriverSection заполняется указатель на _KLDR_DATA_TABLE_ENTRY.


Спасибо за помощь, действительно вся проблема была в том что использовал LDR_DATA_TABLE_ENTRY. Оказывается там другая структура.
Ну а по поводу информации — лишнее не стал приводить, т.к. оно могло сбить с толку.
Re[3]: Получение имени устройства по указателю PDEVICE_OBJECT
От: Denwer Россия  
Дата: 23.09.14 05:35
Оценка: +1
Здравствуйте, eight, Вы писали:

E>Пишется драйвер для секьюрити приложения, есть несколько подзадач — снять хуки у обработчиков IRP, для этого нужно найти конкретное устройство в иерархии. Сейчас проверяется целостность обработчиков каждого подключённого устройства. Ну и так же требуется предоставлять список устройств выше указанного.


Были времена когда писатели секурного софта соревновались с писателями руткитов, кто извернется сильнее. Но писатели секурного софта не понимали, чем они отличаются от писателей руткитов. А разница есть, в руткитах разрешено все что придет в голову разработчику. Но Вы же пишете софт, за который люди будут платить деньги, поэтому они будут ожидать стабильности. Неужели область секурного софта застряла в 2008 году, когда все, кому не лень писали эти чистилки хуков. Да и кто ставит эти хуки на IRP сейчас? От кого защита. Не совершайте ошибок, не применяейте хак-методы, потому что это дебри из которых не вылезти. Сейчас снимете хуки на IRP, потом начнете снимать хуки на Iof*****, потом начнете искать модифицированный код, и в результате — бажный продукт за деньги потребителей. Я сам проходил через это все.
Re[4]: Получение имени устройства по указателю PDEVICE_OBJECT
От: AlexCasual  
Дата: 07.10.14 18:39
Оценка:
D>Были времена когда писатели секурного софта соревновались с писателями руткитов, кто извернется сильнее. Но писатели секурного софта не понимали, чем они отличаются от писателей руткитов. А разница есть, в руткитах разрешено все что придет в голову разработчику. Но Вы же пишете софт, за который люди будут платить деньги, поэтому они будут ожидать стабильности. Неужели область секурного софта застряла в 2008 году, когда все, кому не лень писали эти чистилки хуков. Да и кто ставит эти хуки на IRP сейчас? От кого защита. Не совершайте ошибок, не применяейте хак-методы, потому что это дебри из которых не вылезти. Сейчас снимете хуки на IRP, потом начнете снимать хуки на Iof*****, потом начнете искать модифицированный код, и в результате — бажный продукт за деньги потребителей. Я сам проходил через это все.

А как сейчас пишется security soft? Просто интересно...
Re[5]: Получение имени устройства по указателю PDEVICE_OBJECT
От: Denwer Россия  
Дата: 09.10.14 08:44
Оценка:
Здравствуйте, AlexCasual, Вы писали:

D>>Были времена когда писатели секурного софта соревновались с писателями руткитов, кто извернется сильнее. Но писатели секурного софта не понимали, чем они отличаются от писателей руткитов. А разница есть, в руткитах разрешено все что придет в голову разработчику. Но Вы же пишете софт, за который люди будут платить деньги, поэтому они будут ожидать стабильности. Неужели область секурного софта застряла в 2008 году, когда все, кому не лень писали эти чистилки хуков. Да и кто ставит эти хуки на IRP сейчас? От кого защита. Не совершайте ошибок, не применяейте хак-методы, потому что это дебри из которых не вылезти. Сейчас снимете хуки на IRP, потом начнете снимать хуки на Iof*****, потом начнете искать модифицированный код, и в результате — бажный продукт за деньги потребителей. Я сам проходил через это все.


AC>А как сейчас пишется security soft? Просто интересно...


Пишут сейчас так же, кто во что горазд, а вот нужно писать без хак-методов. Тот же загрузчик Win7 позволяет сделать много интересных вещей, например можно создать имедж-образ урезанной винды и загрузиться с него, можно заранее создать имедж образ линукса, и тоже загрузится с него. А вот от туда лечи уже рабочую ОС без всяких снятий хуков и прочих не хороших способов. Тот же акронис так ресторит системный раздел. Кто мешает секурному софту так поступить?
Re[6]: Получение имени устройства по указателю PDEVICE_OBJECT
От: eight Россия  
Дата: 19.10.14 20:11
Оценка:
Здравствуйте, Denwer, Вы писали:

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


AC>>А как сейчас пишется security soft? Просто интересно...


D>Пишут сейчас так же, кто во что горазд, а вот нужно писать без хак-методов. Тот же загрузчик Win7 позволяет сделать много интересных вещей, например можно создать имедж-образ урезанной винды и загрузиться с него, можно заранее создать имедж образ линукса, и тоже загрузится с него. А вот от туда лечи уже рабочую ОС без всяких снятий хуков и прочих не хороших способов. Тот же акронис так ресторит системный раздел. Кто мешает секурному софту так поступить?


Говоря о Windows, можно сказать что актуальность секьюрити софта вообще отпадает — антивирусы, руткиты и т.п. Хорошая модель безопасности справляется со всем хорошо.
Re[7]: Получение имени устройства по указателю PDEVICE_OBJECT
От: Denwer Россия  
Дата: 20.10.14 06:42
Оценка:
Здравствуйте, eight, Вы писали:

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


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


AC>>>А как сейчас пишется security soft? Просто интересно...


D>>Пишут сейчас так же, кто во что горазд, а вот нужно писать без хак-методов. Тот же загрузчик Win7 позволяет сделать много интересных вещей, например можно создать имедж-образ урезанной винды и загрузиться с него, можно заранее создать имедж образ линукса, и тоже загрузится с него. А вот от туда лечи уже рабочую ОС без всяких снятий хуков и прочих не хороших способов. Тот же акронис так ресторит системный раздел. Кто мешает секурному софту так поступить?


E>Говоря о Windows, можно сказать что актуальность секьюрити софта вообще отпадает — антивирусы, руткиты и т.п. Хорошая модель безопасности справляется со всем хорошо.


В принципе да. Но есть один момент. Это игры и программы, скачанные из торрентов. Часто требуют админских привелегий. Получается не дав привелегии, не установишь прогу/игру. А установив, можешь поймать вирус. Но отдельный игровой комп решает эту проблему. Но в тоже время часто просят отключить антивирусный софт, иначе установку игры не запустить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.