Запись в АП ядра через дров?

Тема в разделе "WASM.NT.KERNEL", создана пользователем test555, 10 дек 2011.

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Задача: нужно записать из юзермода в АП ядра порцию данных, и не важно, по какому адресу, главное - чтобы этот адрес был доступен процессу System и его можно было посчитать (ExAllocPool не подходит).
    (фишка VitrualAlloc выделит память только в контектсе юзермодного процесса, System ее не увидит)

    Вопрос: может кто знает подходящие драйвера, которые принимаю IOCTRL запросы и сохраняют где-то переданный им из юзермода буфер?
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    test555

    Не понял, тебе что надо-то?
    Выделить память в ядре из приложения?
    Или выделить память в ядре из драйвера?
    И какую память надо: физическую или виртуальную?
     
  3. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Нужно из юзермода (без загрузки своих дров) в памяти ядра записать байты (шел-кодес).
    Потом с помощью бажных дров подменой указателя можно передать туда управление.

    То есть нужно записать в ядро шел-кодес, (адрес мы должны уметь вычислять в юзермоде, т.е. это не должна быть динамически выделяемая память), потом через бажный дров подменяется указатель. В какой-то момент процесс System передает управление по этому указателю..

    Пробовал выделить память VirtualAlloc, и подменить указатель на нее, но процесс System не видит этот участок...
     
  4. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Был бы великолепен драйвер который делает примерно так:

    Код (Text):
    1. CHAR Buffer[100] ;
    2. ...
    3. DispatchIoCtrl()
    4. {
    5. if (ControlCode==12345) memcpy(Buffer, UserBuffer,20)
    6.  
    7. }
    и тогда, когда в юзермоде вызываем
    DeviceIoControl (.. 12345, UserBuffer1 ..) то в секцию драйвера, где расположен Buffer[100] - скопируется мой шел. А так как можно узнать базу этого дрова, можно и посчитать этот адрес и потом подсунуть этот адрес как указатель на шел в бажном дрове.


    Подойдут так же системные вызовы функций ядра или графической подсистемы, (NtCreateFile, NtUser....)


    Попрос только в одном - какие вызовы и какие стандартные дрова можно под это дело приспособить...
     
  5. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    MmGetPhysicalAddress
    MmMapIoSpace, MmUnmapIoSpace
     
  6. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    MmGetPhysicalAddress
    MmMapIoSpace, MmUnmapIoSpace
    - функции ядерные ведь, как их вызвать, я до уровня ядра еще не спустился.

    Я нахожусь в юзермоде и не могу грузануть свой драйвер (собственно, если бы мог загрузиться - не пришлось бы так извращяться).
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Так тебе тупо сплоит нужен для проникновения в режим ядра?
     
  8. ejbfcrfvyr

    ejbfcrfvyr New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2011
    Сообщения:
    18
    test555
    Системное ап общее, за исключением сессионного ап и гиперспейса. В контексте любого процесса в пределах сессии ядро общее. Для переключения между сессиями необходим аттачь к сессии. Для доступа к юзермодному ап - аттачь к процессу. Просто же.
    Если нужна запись из юзермода в обход защиты - вам нужен сплоит. Сие драгоценно и года может занять написание такого кода из нескольких строк, так что работайте, дыры будут всегда.
     
  9. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Ну да, чисто записать в ЛЮБОЙ адрес ядра свои байты. Чтобы было понятнее - приведу пример графической системы, в статьях Твистера предлагается "лезть через окно", т.е. зарегистрировать свой класс окна, в названии этого окна и поместить шелкод, это можно сделать из юзерспейса. А адрес названия класса можно подсчитать, итого во всех процессах будет по одному адресу красоваться шел-кодес, и тоже самое будет в ядре, но только для GUI процессов! В этом то вся и фишка, что System не ГУИ процесс и не видит
    gSharedInfo, потому нужен другой способ....
     
  10. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    test555
    и мне и мне )