Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
Получить хочу драйвер для удаления спайваров на макимально... 09.01.06 17:21 Число просмотров: 2444
Автор: Killer{R} <Dmitry> Статус: Elderman
|
> Еще интересно узнать, что именно ты хочешь получить. Может > получится перепоставить задачу, чтоб таких извращений не > требовалось? Получить хочу драйвер для удаления спайваров на макимально ранний момент. Вернее драйвер уже получил, причем прописывается он три раза - на boot, system и auto. Первый загружается, предосталяет интерфейс и работает. Другие два чисто при загрузке делают что надо и выходят из DriverEntry с STATUS_UNSUCCESSFUL. Особенно некрасиво то что каждому драйверу пришлось делать отдельный файл. Тк один файл на всех винда отказывается грузить, видно видит что такой файл уже промаплен как другой драйвер и ругается. Кстати отдельный вопрос - насколько безопасно удалять/подменять .sys файл драйвера после того как он загрузился?
|
<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. > А какого например?
какого - не знаю. почитай руссиновича и ддк. хотя этот вариант страдает имхо некроссплатформенностью.
|
|
|