Добрый день. Столкнулся со следующими вопросами, ответить на которые сам не могу.
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 как это решить.
E>1. Как получить имя устройства если известен указатель PDEVICE_OBJECT?
Так же как и для других честных объектов ядра: ObQueryNameString(...)
E>2. Каким образом в ядре можно перечислить все устройства(DEVICE_OBJECT) или драйвера (DRIVER_OBJECT)?
Перечислив все драйвера можно воспользоваться вызовом IoEnumerateDeviceObjectList(...).
Для перечисления драйверов можно перечислить элементы дерева объектов в \Driver и \FileSystem. Но ядром экспортируется недокументированная функция nt!IoCreateDriver, позволяющая создавать объект драйвера в любом месте иерархии дерева объектов ядра.
E>3. Нужно получить указатель на device_object но он не всегда тот что нужен. см. ниже. E>
E>GetDeviceName возвращает указатель на устройство с использованием IoGetDeviceObjectPointer
В листинге нет упоминания GetDeviceName, допустим речь идет про GetDeviceObject
E> ... I have no idea как это решить.
Не очень понял как пересекаются задачи перечисления всех объектов устройств и поиска конкретного объекта в стеке устройств? Что за глобальная задача решается?
Re[2]: Получение имени устройства по указателю PDEVICE_OBJECT
Здравствуйте, 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
ETI>>Не очень понял как пересекаются задачи перечисления всех объектов устройств и поиска конкретного объекта в стеке устройств? Что за глобальная задача решается? E>Пишется драйвер для секьюрити приложения, есть несколько подзадач — снять хуки у обработчиков IRP, для этого нужно найти конкретное устройство в иерархии. Сейчас проверяется целостность обработчиков каждого подключённого устройства. Ну и так же требуется предоставлять список устройств выше указанного.
Зачем для этих целей перечилять все объекты в системе устройств для меня так и осталось загадкой. P.S. Может в листинге из первого сообщения это пропущено, но функция GetLowestDevice должна синхронизировать доступ к списку DEVOBJ_EXTENSION::AttachedTo
Здравствуйте, EreTIk, Вы писали:
ETI>P.S. Может в листинге из первого сообщения это пропущено, но функция GetLowestDevice должна синхронизировать доступ к списку DEVOBJ_EXTENSION::AttachedTo ETI>
Два одинаковых вызова дают совершенно разные результаты. Мало того что в driver_name находится мусор, так он ещё и разный. Я так подозреваю тут какие-то блокировки нужно было захватить. Я же просто передаю в функцию указатель на DRIVER_OBJECT и просто читает информацию о драйвере.
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>Получается, что я не захватил какую-то блокировку перед обращением к списку?
Возможно вы удивитесь но по логам другого человека, не видя код, который их пишет, сказать можно не так много. Читайте свои посты, перед тем как их отправлять. Откуда я могу знать как и откуда вы читаете строку, которую потом печатаете с префиксом DriverName
Маловероятно, что это связано с блокировкой. По приведенной строчке можно сразу сказать, что _LDR_DATA_TABLE_ENTRY и _KLDR_DATA_TABLE_ENTRY это разные структуры. В _DRIVER_OBJECT::DriverSection заполняется указатель на _KLDR_DATA_TABLE_ENTRY.
Re[6]: Получение имени устройства по указателю PDEVICE_OBJECT
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
Здравствуйте, eight, Вы писали:
E>Пишется драйвер для секьюрити приложения, есть несколько подзадач — снять хуки у обработчиков IRP, для этого нужно найти конкретное устройство в иерархии. Сейчас проверяется целостность обработчиков каждого подключённого устройства. Ну и так же требуется предоставлять список устройств выше указанного.
Были времена когда писатели секурного софта соревновались с писателями руткитов, кто извернется сильнее. Но писатели секурного софта не понимали, чем они отличаются от писателей руткитов. А разница есть, в руткитах разрешено все что придет в голову разработчику. Но Вы же пишете софт, за который люди будут платить деньги, поэтому они будут ожидать стабильности. Неужели область секурного софта застряла в 2008 году, когда все, кому не лень писали эти чистилки хуков. Да и кто ставит эти хуки на IRP сейчас? От кого защита. Не совершайте ошибок, не применяейте хак-методы, потому что это дебри из которых не вылезти. Сейчас снимете хуки на IRP, потом начнете снимать хуки на Iof*****, потом начнете искать модифицированный код, и в результате — бажный продукт за деньги потребителей. Я сам проходил через это все.
Re[4]: Получение имени устройства по указателю PDEVICE_OBJECT
D>Были времена когда писатели секурного софта соревновались с писателями руткитов, кто извернется сильнее. Но писатели секурного софта не понимали, чем они отличаются от писателей руткитов. А разница есть, в руткитах разрешено все что придет в голову разработчику. Но Вы же пишете софт, за который люди будут платить деньги, поэтому они будут ожидать стабильности. Неужели область секурного софта застряла в 2008 году, когда все, кому не лень писали эти чистилки хуков. Да и кто ставит эти хуки на IRP сейчас? От кого защита. Не совершайте ошибок, не применяейте хак-методы, потому что это дебри из которых не вылезти. Сейчас снимете хуки на IRP, потом начнете снимать хуки на Iof*****, потом начнете искать модифицированный код, и в результате — бажный продукт за деньги потребителей. Я сам проходил через это все.
А как сейчас пишется security soft? Просто интересно...
Re[5]: Получение имени устройства по указателю PDEVICE_OBJECT
Здравствуйте, AlexCasual, Вы писали:
D>>Были времена когда писатели секурного софта соревновались с писателями руткитов, кто извернется сильнее. Но писатели секурного софта не понимали, чем они отличаются от писателей руткитов. А разница есть, в руткитах разрешено все что придет в голову разработчику. Но Вы же пишете софт, за который люди будут платить деньги, поэтому они будут ожидать стабильности. Неужели область секурного софта застряла в 2008 году, когда все, кому не лень писали эти чистилки хуков. Да и кто ставит эти хуки на IRP сейчас? От кого защита. Не совершайте ошибок, не применяейте хак-методы, потому что это дебри из которых не вылезти. Сейчас снимете хуки на IRP, потом начнете снимать хуки на Iof*****, потом начнете искать модифицированный код, и в результате — бажный продукт за деньги потребителей. Я сам проходил через это все.
AC>А как сейчас пишется security soft? Просто интересно...
Пишут сейчас так же, кто во что горазд, а вот нужно писать без хак-методов. Тот же загрузчик Win7 позволяет сделать много интересных вещей, например можно создать имедж-образ урезанной винды и загрузиться с него, можно заранее создать имедж образ линукса, и тоже загрузится с него. А вот от туда лечи уже рабочую ОС без всяких снятий хуков и прочих не хороших способов. Тот же акронис так ресторит системный раздел. Кто мешает секурному софту так поступить?
Re[6]: Получение имени устройства по указателю PDEVICE_OBJECT
Здравствуйте, Denwer, Вы писали:
D>Здравствуйте, AlexCasual, Вы писали:
AC>>А как сейчас пишется security soft? Просто интересно...
D>Пишут сейчас так же, кто во что горазд, а вот нужно писать без хак-методов. Тот же загрузчик Win7 позволяет сделать много интересных вещей, например можно создать имедж-образ урезанной винды и загрузиться с него, можно заранее создать имедж образ линукса, и тоже загрузится с него. А вот от туда лечи уже рабочую ОС без всяких снятий хуков и прочих не хороших способов. Тот же акронис так ресторит системный раздел. Кто мешает секурному софту так поступить?
Говоря о Windows, можно сказать что актуальность секьюрити софта вообще отпадает — антивирусы, руткиты и т.п. Хорошая модель безопасности справляется со всем хорошо.
Re[7]: Получение имени устройства по указателю PDEVICE_OBJECT
Здравствуйте, eight, Вы писали:
E>Здравствуйте, Denwer, Вы писали:
D>>Здравствуйте, AlexCasual, Вы писали:
AC>>>А как сейчас пишется security soft? Просто интересно...
D>>Пишут сейчас так же, кто во что горазд, а вот нужно писать без хак-методов. Тот же загрузчик Win7 позволяет сделать много интересных вещей, например можно создать имедж-образ урезанной винды и загрузиться с него, можно заранее создать имедж образ линукса, и тоже загрузится с него. А вот от туда лечи уже рабочую ОС без всяких снятий хуков и прочих не хороших способов. Тот же акронис так ресторит системный раздел. Кто мешает секурному софту так поступить?
E>Говоря о Windows, можно сказать что актуальность секьюрити софта вообще отпадает — антивирусы, руткиты и т.п. Хорошая модель безопасности справляется со всем хорошо.
В принципе да. Но есть один момент. Это игры и программы, скачанные из торрентов. Часто требуют админских привелегий. Получается не дав привелегии, не установишь прогу/игру. А установив, можешь поймать вирус. Но отдельный игровой комп решает эту проблему. Но в тоже время часто просят отключить антивирусный софт, иначе установку игры не запустить.