· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Call user from Kernel...

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июн 25, 2004 00:35:27

Здравствуйте, уважаемые!
Сессия уже на последней стадии и пора заняться делом. Пара вопросиков.

1)Допусти у меня есть стандартная user – библиотека. Я вызываю ч/з DeviceIoControl драйвер –> я в контексте вызывающего процесса -> если страницы этой библиотеки защищены от записей, то просто ч/з страничную адресацию я подправляю битик и одновременно смотря на флаг present . Теперь вопрос: как защитить себя от того, чтобы между инструкциями проверки на присутствие в памяти и правкой бита, страница не сбросилась в файл подкачки. Знаю, что вопрос тупой и вариантов решения много. Интересует самый надежный и безопасный. Please.

2) Задача: А) запустить exe-модуль из ф-ии драйвера в контексте процесса system. Тута вообще темно. Безуспешно пялился PspUserThreadStartup, PsCreateSystemProcess… из private\ntos\ps\ но кто либо уходил в PspCreateProcess с неизвестной ACCESS_MASK, которая типа сказана для каждого объекта своя, но какая??? Да и вообще там POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL , так как – передавать адрес файла ч/з эту структуру или… короче с параметрами – тьма. И соответственно, никакой документации нет. Б)Запустить кусок кода в user-адресном пространстве, так же из процесса system.
В принципе, вся цель состоит в том, чтобы из kernel_mode вызвать код, у которого в адр. пр-ве присутствуют user библиотеки, с последующем их мучением.

ЗЫ сильно не пинайте. В голове и так каша. В качестве ответов - хоть чё-нибудь, пожалуйста.

Заранее благодарен --==PPS==--


Дата: Июн 25, 2004 21:32:04

1. Если всё это делается подряд, т.е. проверка, и потом сразу правка бита, т.е. много времени не занимает, то можно прописать cli перед проверкой и sti после правки. Только не понятно, что делать, если страницы в памяти нет..

2. Посмотри описание Native API, там есть функция создания процесса(которая в ntdll.dll), создание его в kernel mode ничем не должно отличаться, параметры функций в ntdll при переходе в ntoskrnl обычно не меняются.


Дата: Июн 25, 2004 23:15:06

2 dragon
1) Спасиба
2) Попробую, не пробовал смотреть как там и повторять... Но плохое предчувствие.


Дата: Июн 26, 2004 01:27:55

[ PavPS: Интересует самый надежный и безопасный. ]

Если делать это по научному, то нужно смотреть в сторону переотображения памяти.
IoAllocateMdl
MmProbeAndLockPages - сама подгрузит если сброшено в файл подкачки
MmMapLockedPagesSpecifyCache

или т.п.


[ PavPS: запустить exe-модуль из ф-ии драйвера в контексте процесса system. ]

Если ты хочешь создать процесс, то имхо придется обломиться. Это настолько глобальная фича, что...


[ PavPS: которая типа сказана для каждого объекта своя, но какая??? ]

Валидную маску доступа для объекта "процесс" можно посмотреть запустив WinObjEx (см. в инструментах на сайте) и посмотрев свойства объекта \ObjectTypes\Process. Или в хидерах порыться.


[ PavPS: так как – передавать адрес файла ч/з эту структуру или… ]

Никак. PspCreateProcess не использует путь к екзешнику. Ей нужет хендл секции, на которую он отображен. См. аттач. Это просто переписанный на асм пример из Гари Небетта.


[ PavPS: Запустить кусок кода в user-адресном пространстве, так же из процесса system. ]

У процесса system, вроде, вообще нет юзерного пространства. Так что KeAttachProcess, мучить какой-нить юзерный процесс и KeDetachProcess.


[ PavPS: В принципе, вся цель состоит в том, чтобы из kernel_mode вызвать код, у которого в адр. пр-ве присутствуют user библиотеки, с последующем их мучением. ]

Вообще-то такого нет "by design", как говорят у них :) Но система, по крайней мере, win32k.sys использует callback из ядра в юзер. Я как-то начал в этом копаться, да забросил. Цепляйся к этому и копай.

PEB.KernelCallbackTable - указатель на массив адресов в библиотеке user32.dll, которые win32k.sys вызывает из ядра. KeUserModeCallback, KeUserCallbackDispatcher, NtCallbackReturn. Может быть как то можно это для себя использовать.


Дата: Июн 26, 2004 01:34:01


Дата: Июн 26, 2004 01:47:21

2 Four-F

Большое спасибо!!!

...Пережевываю... Немало.


Дата: Июн 26, 2004 13:03:37

На счет создания процесса из ядря - это, IMHO, несколько бессмысленно. Если драйвер запущен из юзера, то проще оттуда же и процесс создать. Если он автоматически загружается, то тогда можно создать службу. Пусть она процесс и создает. Драйвер и служба легко могут общаться между собой. Все документировано.


Дата: Июн 26, 2004 18:16:28

Дело в том, что служда из юзера запускается всего лишь раз - а потом при каждой загрузке автозапуском. Требования такие, чтобы не каких - Exe модулей небыло. Винда сама дальше drv запускает...


Дата: Июн 27, 2004 17:01:39

Что-то не совсем понял. Ты же сам говорил "Задача: запустить exe-модуль из ф-ии драйвера в контексте процесса system.". Так есть exe-модуль или нет? Или ты хочешь его как dll грузить? Тогда все одно модуль то будет.


Дата: Июн 27, 2004 20:49:05

Four-F

Вкратции основные моменты, а то что-то я всех путаю.
1) сажусь за комп. Запускаю XXX.EXE Он получает Админ-пороль,impersonate..., извлекает из себя драйвер, грузит его.
2)Драйвер анализирует системные либы,импорт,експорт, загруженые модули(у разных NT-разные адреса ф-й), из этого получает адреса основных хуков,устанавливает хуки, + чё-то делает. Прекрывает все пути его отключения/ удаления/удаления из автозапуска+постоянное наблюдение за тем, чтобы хуки стояли в верху.
3)При каждой загрузке винды грузится +пункт 2.
4)При определенных событиях, распаковывает из себя (paged data) EXE-модуль.
5)Запускает его.
6)Ехе Модуль недокументированно открывает доступ к файлу драевера, документированно связавается и запрашивает: какое действие произвести.
7)делает что надо
8)удаляется, доступ к драйверу закрывается.

Так вот все пункты есть, кроме 5-го пункта. Вот над ним счаз и мучаюсь. Кстати систему не тормозит, т.к. для хуков есть таблица асинхронных вызовов.

"Или ты хочешь его как dll грузить?" - Из kernel_mode?? А как это/ где почитать.

P.S. Прошу прощения за такой "стриптиз" программы.


Дата: Июн 28, 2004 21:50:04

[ PavPS: 5)Запускает его. ]

Т.е. создает процесс. Если у тя это получится, то интересно было бы взглянуть на код.


[ PavPS: Из kernel_mode?? А как это/ где почитать. ]

Это я спросил. Как это сделать не знаю.


[ PavPS: Так что вот непонятно – чья нить то? Какого из процессов??? ]

Того, который вызывает KeAttachProcess. Она просто переключает адресный контекст процесса, помещая в cr3 физический адрес каталога страниц процесса-цели. И не больше.


[ PavPS: но кто запрещает подкачивать, веди стоит даже IRQL=PASSIVE_LEVEL ]

KeAttachProcess повышает IRQL до DISPATCH_LEVEL!!! Так что аккуратно :)


[ PavPS: Так же по этой теме, справочного х-ра: как бы определить имя процесса, так например SYSTEM это или нет ]

К имени лучше не привязываться. Проще вызвать IoGetCurrentProcess в DriverEntry и запомнить указатель, а потом с ним сравнивать.


[ PavPS: Спрашивается – зачем же недок. ф-ии вставлять в EXPORT_TABLE? ]

Затем, чтоб другие компоненты системы (HAL, например) их юзали.


Дата: Июн 29, 2004 02:05:21 · Поправил: PavPS

2 Moderators

А куда делся пост, кторый был перед этим ответом Four-F
?
В нембыло что-то такое... что заставило его исчезнуть? или как?

2 Four-F
Спасибо за ответы.

- Как раз 5-й пункт я оставил, с 4-го по 8-й создал, а теперь реализую 5-й.

- После вызова KeAttach... я проверяю IRQL и он мне выдает PASSIVE_LEVEL. И всё же есть какие-то предположения об таких BugCheck - возбудителях ошибок ??? Почему API не пашут?

- Код в исходнике очень похож на RtlCreateUserProcess.

- Кстати, не KeAttachProcess выход из положения, а этот исходник, чем и очень благодарен. Хотя некоторые ф-ии отсутствуют в ntoskrnl.exe, но ч/з SDT достать можно.

Р.Ы. Извиняюсь за постоянный мусор в посте - ни комментариев, ни цитат, но у меня в Opera ничё не пашет. Самому ненравится


Дата: Июн 29, 2004 02:45:30

[ PavPS: А куда делся пост ]

Дико извиняюсь. Это, похоже, я его потер. Случайно :(

Насчет KeAttachProcess я прогнал маленько. Т.е. она конечно повышает IRQL до DISPATCH_LEVEL, но потом опускает назад. В любом случае, т.к. она только меняет адресный контекст, приаттачишись к др. процессу можно делать только весьма ограниченный набор действий. Например, можно по хендлу получить ссылку через ObReferenceObjectByHandle или скопировать что-нить через memcpy или что-нить в этом роде.


Дата: Июн 29, 2004 02:55:57

Спасибо за ответ! Теперь точно отрубаю дорогу к KeAttachProcess.

Для целостности трэда могу опять запостить - я сначала в Word-е пишу. Если надо, конечно.

Вот только с Вашим аттачем разберусь, впихну в проект и попрут вопросы.
Еше раз спасибо.


Дата: Июл 1, 2004 20:04:42

Всем привет!

2 Four-F
Вот невезуха, никак ну никак… Пример то классный, давот одно но:
Там часть ф-й из ntdll, а часть из ntoskrnl.exe. Те ф-ии, что в ntdll, улетают через SDT в ntoskrnl, но вотодна: RtlCreateProcessParameters имеется только в ntdll. Последов-но переписывая Ваш исходник себе, уже дойдя почти до конца, наткнулся на RtlCreateProcessParameters и застрял.
Так что же теперь: проецировать себе в адр. пр-во ntdll. Так вообще если бы я это мог раньше, то даже создавать процесс из user_mode ненадо было бы. Обошелся бы.
Так вот вопрос:
1)кто что посоветует ?
2)а как спроецировать либу в моё адр. пр-во (kernel_mode)? Теперь буду именно по этой теме копать.

Заранее благодарен. --==ППС==--

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072