Задача: нужно записать из юзермода в АП ядра порцию данных, и не важно, по какому адресу, главное - чтобы этот адрес был доступен процессу System и его можно было посчитать (ExAllocPool не подходит). (фишка VitrualAlloc выделит память только в контектсе юзермодного процесса, System ее не увидит) Вопрос: может кто знает подходящие драйвера, которые принимаю IOCTRL запросы и сохраняют где-то переданный им из юзермода буфер?
test555 Не понял, тебе что надо-то? Выделить память в ядре из приложения? Или выделить память в ядре из драйвера? И какую память надо: физическую или виртуальную?
Нужно из юзермода (без загрузки своих дров) в памяти ядра записать байты (шел-кодес). Потом с помощью бажных дров подменой указателя можно передать туда управление. То есть нужно записать в ядро шел-кодес, (адрес мы должны уметь вычислять в юзермоде, т.е. это не должна быть динамически выделяемая память), потом через бажный дров подменяется указатель. В какой-то момент процесс System передает управление по этому указателю.. Пробовал выделить память VirtualAlloc, и подменить указатель на нее, но процесс System не видит этот участок...
Был бы великолепен драйвер который делает примерно так: Код (Text): CHAR Buffer[100] ; ... DispatchIoCtrl() { if (ControlCode==12345) memcpy(Buffer, UserBuffer,20) } и тогда, когда в юзермоде вызываем DeviceIoControl (.. 12345, UserBuffer1 ..) то в секцию драйвера, где расположен Buffer[100] - скопируется мой шел. А так как можно узнать базу этого дрова, можно и посчитать этот адрес и потом подсунуть этот адрес как указатель на шел в бажном дрове. Подойдут так же системные вызовы функций ядра или графической подсистемы, (NtCreateFile, NtUser....) Попрос только в одном - какие вызовы и какие стандартные дрова можно под это дело приспособить...
MmGetPhysicalAddress MmMapIoSpace, MmUnmapIoSpace - функции ядерные ведь, как их вызвать, я до уровня ядра еще не спустился. Я нахожусь в юзермоде и не могу грузануть свой драйвер (собственно, если бы мог загрузиться - не пришлось бы так извращяться).
test555 Системное ап общее, за исключением сессионного ап и гиперспейса. В контексте любого процесса в пределах сессии ядро общее. Для переключения между сессиями необходим аттачь к сессии. Для доступа к юзермодному ап - аттачь к процессу. Просто же. Если нужна запись из юзермода в обход защиты - вам нужен сплоит. Сие драгоценно и года может занять написание такого кода из нескольких строк, так что работайте, дыры будут всегда.
Ну да, чисто записать в ЛЮБОЙ адрес ядра свои байты. Чтобы было понятнее - приведу пример графической системы, в статьях Твистера предлагается "лезть через окно", т.е. зарегистрировать свой класс окна, в названии этого окна и поместить шелкод, это можно сделать из юзерспейса. А адрес названия класса можно подсчитать, итого во всех процессах будет по одному адресу красоваться шел-кодес, и тоже самое будет в ядре, но только для GUI процессов! В этом то вся и фишка, что System не ГУИ процесс и не видит gSharedInfo, потому нужен другой способ....