|
|
| Посл.отвђт | Сообщен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)? Теперь буду именно по этой теме копать. Заранее благодарен. --==ППС==-- |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072 |