информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Страшный баг в WindowsПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Нашел самый правильный способ отлавливания момента доступности дисков [upd] 10.01.06 13:10  Число просмотров: 2964
Автор: amirul <Serge> Статус: The Elderman
Отредактировано 10.01.06 13:17  Количество правок: 1
<"чистая" ссылка>
> а посмотрел код IoInitSystem в
> win2k\private\ntos\io\ioinit.c
> Хотя учту. Проверю это дело под разными виндами

Насчет того, что симлинки создаются прямо в ftdisk-е это соврал. Вернее симлинки создаются, но я не посмотрел какие. А создается там симлинк \Device\Harddisk0\Volume1 -> \Device\HarddiskVolume1

Симлинки же в \DosDevices\ создаются в MountMgr.sys
kd> kv
ChildEBP RetAddr  Args to Child              
fc912c0c fc4dbc4b fc912c20 fc912c6c 00000000 nt!IoCreateSymbolicLink (FPO: [Non-Fpo])
fc912c28 fc4e27a8 e1287520 fc912c6c fc4db99c MountMgr!GlobalCreateSymbolicLink+0x23 (FPO: [Non-Fpo])
fc912ca4 fc4e2b3b 80e4be48 fc912d64 00000000 MountMgr!MountMgrMountedDeviceArrival+0x380 (FPO: [Non-Fpo])
fc912cc8 8054c75a fc912d1c 80e4be48 804ed100 MountMgr!MountMgrMountedDeviceNotification+0x49 (FPO: [Non-Fpo])
fc912cf0 805a1908 fc4e2af2 fc912d1c 80e4be48 nt!PiNotifyDriverCallback+0x6d (FPO: [Non-Fpo])
fc912d44 805a1fca e1280278 8065d578 00000001 nt!IopNotifyDeviceClassChange+0xab (FPO: [Non-Fpo])
fc912d74 804ebd08 80e76cd0 00000000 80e8f020 nt!PiWalkDeviceList+0xae (FPO: [Non-Fpo])
fc912dac 80559026 80e76cd0 00000000 00000000 nt!ExpWorkerThread+0xfe (FPO: [Non-Fpo])
fc912ddc 8050f513 804ebc35 00000001 00000000 nt!PspSystemThreadStartup+0x34 (FPO: [Non-Fpo])
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
kd> dS fc912c20; dS fc912c6c
e1287828  "\GLOBAL??\Volume{57dd9f09-2359-1"
e1287868  "1d9-91ad-806d6172696f}"
e1288bf0  "\Device\HarddiskVolume1"

---

Происходит это сразу после реэнумерации устройств в PartMgr-е (еще до выхода из IopInitializeBootDrivers) и до начала инициализации системных драйверов (IopInitializeSystemDrivers). Короче сам mount manager получает информацию о новых дисках через нотификацию, зарегистрированную в IoRegisterPlugPlayNotification

Если не хватит MSDN-а, можешь глянуть на код \private\ntos\mountmgr\mountmgr.c на предмет использования или поискать в гугльгруппах

-----------------
Кстати, а где это в IoInitSystem видно, что можно использовать диски (правда не по симлинкам, а напрямую через устройства)? Сами девайсы создаются уже после инициализации ВСЕХ boot-драйверов во время энумерации девайсов, а симлинки к ним, как я уже сказал в MountMgr-е во время нотификации об изменениях в классе "Дисковые устройства"
<programming>
[Win32] Загрузка системы: переход из boot в system 09.01.06 14:25  
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 09.01.06 14:26  Количество правок: 1
<"чистая" ссылка>
Есть драйвер, который грузится в BOOT.
Вопрос/утверждение №1: На этом этапе файловые системы смонтированы read-only. И то лишь частично (SystemRoot)...
Вопрос №2: А как получить нотификейшн о том что зыгрузка системы перешла из стадии boot и файловая система стала доступна на запись? Причем без создания треда который будет периодически проверять..
вопрос2: запускай дополнительный драйвер запускающийся как... 09.01.06 14:44  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
> Есть драйвер, который грузится в BOOT.
> Вопрос/утверждение №1: На этом этапе файловые системы
> смонтированы read-only. И то лишь частично (SystemRoot)...
> Вопрос №2: А как получить нотификейшн о том что зыгрузка
> системы перешла из стадии boot и файловая система стала
> доступна на запись? Причем без создания треда который будет
> периодически проверять..

вопрос2: запускай дополнительный драйвер запускающийся как system и имеющий единственную функцию - сигнализировать первому и выйти.
вариант - делай waitforsingleobject для какого-нибудь объекта ядра, который освобождается при переходе в system.
Пока примерно так и собираюсь делать, но некрасиво это... 09.01.06 15:15  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
> вопрос2: запускай дополнительный драйвер запускающийся как
> system и имеющий единственную функцию - сигнализировать
> первому и выйти.
Пока примерно так и собираюсь делать, но некрасиво это как-то..

> вариант - делай waitforsingleobject для какого-нибудь
> объекта ядра, который освобождается при переходе в system.
А какого например?
Зато что называется "System friendly" :-) 09.01.06 17:08  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Отдельный драйвер в System-е это правильно.

Предложу пару "неправильных" (но возможно более красивых) вариантов:

1. Стать upper фильтром у класса "Дисковые Устройства". К тому моменту, когда вызовут твой AddDevice, девайс HarddiskVolumeX будет уже создан. Создавать и пихать на стек что-то свое вовсе необязательно

2. Во время инициализации заменить AddDevice какому нибудь фильтру "Дисковых Устройств" (например PartMgr-у). Главное чтоб твой драйвер проинициализировался позже этого самого фильтра (легко настраивается при помощи тегов и зависимостей). При входе в AddDevice нижние устройства (те самые HarddiskVolumeX) уже созданы, а при выходе над ними еще и фильтр торчит.

3. При инициализации перехватить IRP_MJ_PNP у PartMgr-а. После завершения IRP_MJ_PNP/IRP_MN_QUERY_DEVICE_RELATIONS устройства будут созданы.

4. Фильтровать IRP_MJ_INTERNAL_DEVICE_CONTROL на предмет IoControlCode == 0x00760000 (Partition Arrived)

В общем отловить момент создания стека нужного устройства. Создается оно уже с проинициализированным, но не примаунченным VPB и при первой же попытке открыть файл на этом устройстве маунтится в IoCheckVpbMounted (которая вызывается из Parse процедуры - IopParseDevice). Из всех способов рекомендую остановиться на тех, которые позволяют отловить создание ВСЕГО стека, а не только самого HarddiskVolume (как по мне, лучше всего первый вариант)

Еще интересно узнать, что именно ты хочешь получить. Может получится перепоставить задачу, чтоб таких извращений не требовалось?
Получить хочу драйвер для удаления спайваров на макимально... 09.01.06 17:21  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
> Еще интересно узнать, что именно ты хочешь получить. Может
> получится перепоставить задачу, чтоб таких извращений не
> требовалось?
Получить хочу драйвер для удаления спайваров на макимально ранний момент. Вернее драйвер уже получил, причем прописывается он три раза - на boot, system и auto. Первый загружается, предосталяет интерфейс и работает. Другие два чисто при загрузке делают что надо и выходят из DriverEntry с STATUS_UNSUCCESSFUL. Особенно некрасиво то что каждому драйверу пришлось делать отдельный файл. Тк один файл на всех винда отказывается грузить, видно видит что такой файл уже промаплен как другой драйвер и ругается. Кстати отдельный вопрос - насколько безопасно удалять/подменять .sys файл драйвера после того как он загрузился?
Вот это "что надо" и интересно. 09.01.06 18:08  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> > Еще интересно узнать, что именно ты хочешь получить.
> Может
> > получится перепоставить задачу, чтоб таких извращений
> не
> > требовалось?
> Получить хочу драйвер для удаления спайваров на макимально
> ранний момент. Вернее драйвер уже получил, причем
> прописывается он три раза - на boot, system и auto. Первый
> загружается, предосталяет интерфейс и работает. Другие два
> чисто при загрузке делают что надо и выходят из DriverEntry

Вот это "что надо" и интересно.

> с STATUS_UNSUCCESSFUL. Особенно некрасиво то что каждому
> драйверу пришлось делать отдельный файл. Тк один файл на
> всех винда отказывается грузить, видно видит что такой файл
> уже промаплен как другой драйвер и ругается. Кстати

Так может тебе NtLoadDriver перехватить? Практически уверен, что отлуп ты получаешь уже внутри, но внутрь тебе не особо и надо. На входе ты получишь путь в реестре к ветке с твоим сервисом. Вот и создай MySystemService и MyAutoService, а в захученном NtLoadDriver-е проверяй DriverServiceName и если запускается нужный сервис, делай работу и выходи со своим неудачным статусом.

> отдельный вопрос - насколько безопасно удалять/подменять
> .sys файл драйвера после того как он загрузился?

Совершенно безопасно. Переименовать и вместо него писать что угодно. Так можно заменить даже ntoskrnl.exe (только система потом может отказаться грузиться). Да, еще вполне возможно придется побороться с SFC, но это уже второй трудный вопрос :-)
На данный момент удаление файлов/ключей реестра. А тут... [UPD] 09.01.06 18:19  
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 09.01.06 18:35  Количество правок: 1
<"чистая" ссылка>
> Первый
> > загружается, предосталяет интерфейс и работает. Другие
> два
> > чисто при загрузке делают что надо и выходят из
> DriverEntry
>
> Вот это "что надо" и интересно.
На данный момент удаление файлов/ключей реестра. А тут всякие HKLM\Software появляются непонятно когда..

> работу и выходи со своим неудачным статусом.
>
> > отдельный вопрос - насколько безопасно
> удалять/подменять
> > .sys файл драйвера после того как он загрузился?
>
> Совершенно безопасно. Переименовать и вместо него писать
> что угодно. Так можно заменить даже ntoskrnl.exe (только
> система потом может отказаться грузиться). Да, еще вполне
> возможно придется побороться с SFC, но это уже второй
> трудный вопрос :-)
Ну это я вообще сам себя хочу удалять так. Так что нам не страшен SFC Ж)

[UPD]
Похоже с файлами проблема решена. Удалять их можно и из boot-time (по кр мере если драйвер в Base группе). Только делать это надо по путям типа \Device\HarddiskVolume1\....
Странно 09.01.06 18:55  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> На данный момент удаление файлов/ключей реестра. А тут
> всякие HKLM\Software появляются непонятно когда..

Их кажись монтирует smss. У него даже вызов специальный есть NtInitializeRegistry(). Кстати, тоже системный сервис, а следовательно легко перехватывается, а значит можно очень точно отловить момент появления реестра.

> [UPD]
> Похоже с файлами проблема решена. Удалять их можно и из
> boot-time (по кр мере если драйвер в Base группе). Только
> делать это надо по путям типа \Device\HarddiskVolume1\....

Вот это странно. Я специально ставил драйвер в boot но после ftdisk-а.
Так вот, при инициализации ftdisk создает всего одно устройство - FtControl, когда вызывался мой DriverEntry ни одного HarddiskVolume еще не было. Появлялись они уже после того как винда проинициализировала все boot-драйвера и начала рассылать IRP_MN_ENUMERATE_DEVICE_RELATIONS. Более того, симлинки в \GLOBAL??\ (эти самые C:, D: и т.д.) создаются одновременно с самими девайсами (в той же самой FtpPartitionArrived).

Ты уверен, что именно boot-драйверу доступны HarddiskVolume?
Я собственнно это не с балды решил так.. 09.01.06 19:05  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
а посмотрел код IoInitSystem в win2k\private\ntos\io\ioinit.c
Хотя учту. Проверю это дело под разными виндами

> > На данный момент удаление файлов/ключей реестра. А тут
> > всякие HKLM\Software появляются непонятно когда..
>
> Их кажись монтирует smss. У него даже вызов специальный
> есть NtInitializeRegistry(). Кстати, тоже системный сервис,
> а следовательно легко перехватывается, а значит можно очень
> точно отловить момент появления реестра.
Угу. Но я пока возлагаю надежды на ZwNotifyChangeKey.
Нашел самый правильный способ отлавливания момента доступности дисков [upd] 10.01.06 13:10  
Автор: amirul <Serge> Статус: The Elderman
Отредактировано 10.01.06 13:17  Количество правок: 1
<"чистая" ссылка>
> а посмотрел код IoInitSystem в
> win2k\private\ntos\io\ioinit.c
> Хотя учту. Проверю это дело под разными виндами

Насчет того, что симлинки создаются прямо в ftdisk-е это соврал. Вернее симлинки создаются, но я не посмотрел какие. А создается там симлинк \Device\Harddisk0\Volume1 -> \Device\HarddiskVolume1

Симлинки же в \DosDevices\ создаются в MountMgr.sys
kd> kv
ChildEBP RetAddr  Args to Child              
fc912c0c fc4dbc4b fc912c20 fc912c6c 00000000 nt!IoCreateSymbolicLink (FPO: [Non-Fpo])
fc912c28 fc4e27a8 e1287520 fc912c6c fc4db99c MountMgr!GlobalCreateSymbolicLink+0x23 (FPO: [Non-Fpo])
fc912ca4 fc4e2b3b 80e4be48 fc912d64 00000000 MountMgr!MountMgrMountedDeviceArrival+0x380 (FPO: [Non-Fpo])
fc912cc8 8054c75a fc912d1c 80e4be48 804ed100 MountMgr!MountMgrMountedDeviceNotification+0x49 (FPO: [Non-Fpo])
fc912cf0 805a1908 fc4e2af2 fc912d1c 80e4be48 nt!PiNotifyDriverCallback+0x6d (FPO: [Non-Fpo])
fc912d44 805a1fca e1280278 8065d578 00000001 nt!IopNotifyDeviceClassChange+0xab (FPO: [Non-Fpo])
fc912d74 804ebd08 80e76cd0 00000000 80e8f020 nt!PiWalkDeviceList+0xae (FPO: [Non-Fpo])
fc912dac 80559026 80e76cd0 00000000 00000000 nt!ExpWorkerThread+0xfe (FPO: [Non-Fpo])
fc912ddc 8050f513 804ebc35 00000001 00000000 nt!PspSystemThreadStartup+0x34 (FPO: [Non-Fpo])
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
kd> dS fc912c20; dS fc912c6c
e1287828  "\GLOBAL??\Volume{57dd9f09-2359-1"
e1287868  "1d9-91ad-806d6172696f}"
e1288bf0  "\Device\HarddiskVolume1"

---

Происходит это сразу после реэнумерации устройств в PartMgr-е (еще до выхода из IopInitializeBootDrivers) и до начала инициализации системных драйверов (IopInitializeSystemDrivers). Короче сам mount manager получает информацию о новых дисках через нотификацию, зарегистрированную в IoRegisterPlugPlayNotification

Если не хватит MSDN-а, можешь глянуть на код \private\ntos\mountmgr\mountmgr.c на предмет использования или поискать в гугльгруппах

-----------------
Кстати, а где это в IoInitSystem видно, что можно использовать диски (правда не по симлинкам, а напрямую через устройства)? Сами девайсы создаются уже после инициализации ВСЕХ boot-драйверов во время энумерации девайсов, а симлинки к ним, как я уже сказал в MountMgr-е во время нотификации об изменениях в классе "Дисковые устройства"
какого - не знаю. почитай руссиновича и ддк. хотя этот... 09.01.06 16:36  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
> > вопрос2: запускай дополнительный драйвер запускающийся
> как
> > system и имеющий единственную функцию -
> сигнализировать
> > первому и выйти.
> Пока примерно так и собираюсь делать, но некрасиво это
> как-то..
>
> > вариант - делай waitforsingleobject для какого-нибудь
> > объекта ядра, который освобождается при переходе в
> system.
> А какого например?

какого - не знаю. почитай руссиновича и ддк. хотя этот вариант страдает имхо некроссплатформенностью.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach