Способы изменить юзерскую память из кернела

Тема в разделе "WASM.WIN32", создана пользователем Saint German, 10 ноя 2005.

  1. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    Собственно в этом и вопрос, хорошо бы их перечислить и описать некоторые.
     
  2. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    У меня такая же тема тут уже дня 2 безответная лежит...

    Раньше я видел 1 способ: Получить адрес буфера памяти юзера (с помощью ioctl METHOD_NEITHER например) и потом писать туда, только IRQL должен быть не выше чем PASSIVE, иначе bsod... Надо будет как нибудь попробовать из потока пописать... Я в прошлый раз ему поставал LOW_REALTIME_PRIORITY, может поэтому свой bsod получил... Надо с LOW_PRIORITY попробовать.
     
  3. Ation

    Ation New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2005
    Сообщения:
    92
    Адрес:
    Zaporozhie
    а почему так категорично - из ядра?
     
  4. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Почитай Таненбаума "Современные операционные системы" Глава 4 стр. 217 понятно будет, почему не так просто. Для примера:

    Память разбита на сегменты (4-8 кб.) ОСь следит за тем, как она расходуется и неактивные потоки выгружает на диск. Как только поток обращается к памяти н-р mov eax, dword ptr [edi] и если такой страницы нет в ОЗУ, ОСь лезет в своп и загружает эту страницу в физическую память, отображает её на виртуальное пространство потока и передаёт управление ему. Это называется "страничное прерывание", оно прозрачно для потока. Таких прерываний очень много (даже если поставить 4 гб памяти своп будет всёравно) Отсюда вывод - для ring0 сейчас есть страница, через 100мс - её нет :) вот и соображай как вычислять, причём в Windows, как мне кажется в этом случае, надо подниматься до уровня диспетчера или выше, иначе в момент расчёта, диспетчер памяти вытеснит твой поток и опять чё-нить, куда-нить скинет :) А вот как расчитать где лежит кусок кода лучше ответят гуру, в этом я несилён ;)
     
  5. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Ation, ну, представь себе ситуацию, когда ты по прерыванию считываешь данные из устройства, и должен немедленно их обработать, но код который это делает лежит в усермоде памяти(категорично).

    SteelRat, а что ты предлагаешь вычислять? По-моему надо просто "заморозить" страницу - прописать где-то какой-то битик.
     
  6. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Может сделать это используя NtWriteVirtualMemory?
     
  7. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    ubil

    по-моему обрабатывать прерывания ринг3 кодом это из серии особо утонченных извращений...
     
  8. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    Собственно есть исходник hybridhook, звучит примерно так-

    MmCreateMdl->MmBuildMdlForNonPagedPool->MmMapLockedPages->

    MmUnmapLockedPages->IoFreeMdl.

    но проблема в том, что по некоторым адресам не получается изменить память.
     
  9. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    ubil

    Возможно это тебе поможет,-

    файл misc.h, от he4
     
  10. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Saint German

    файл misc.h, от he4 - это что?

    Интересно, по каким адресам не получается менять?

    infern0

    Ну, обработка прерывания - это сильно преувеличено сказано. Нужно просто максимально быстро давать usermode знать что внутри драйвера творится, и также быстро давать ему команды.
     
  11. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    а полный проект ищи на руткит.ком



    А менять не получается в одной, своей ДЛЛ, а системные можно, но мне нужно в своей, любой, может дело в базе?

    10000000

    [​IMG] _1123859925__Рабочий стол.zip
     
  12. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    Вот фокус-покус в гибридхуке, этот описан у Свена Шрайбера, на странице 280, написано там, что такое загадочные 0x7ffe0000, 0xffdf0000 Какие будут предложения по аналогу ZwWriteVirtualMemory?
     
  13. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    Варианты с ZwWriteVirtualMemory не предлагать:)

    Во-первых, нужно еще получить ее адрес из sdt,

    во-вторых, ее часто перехватывают,

    в-третьих используя ее нужно иметь нужный PrevMode,

    придется - использовать воркайтемы.

    В общем сам не курю и вам не советую:)
     
  14. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Что-то я не пойму эту схему

    MmCreateMdl->MmBuildMdlForNonPagedPool->MmMapLockedPages->

    MmUnmapLockedPages->IoFreeMdl.



    Может напишешь с какими параметрами вызывать первые 3 функции? А то че-та у меня синий экран сильно часто получается... Предварительно я приаттачился к usermode процессу если че.
     
  15. Narkoliga

    Narkoliga New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    19
    Адрес:
    С конопляного поля :)
    Юзай лучше IoAllocateMdl, либо если размер MDL заранее известен, то быстрее будет MmInitializeMdl.

    MmBuildMdlForNonPagedPool ни в коем случае нельзя использовать для мдл взятой от юзермодных адресов, вместо этого надо использовать MmProbeAndLockPages.

    IoFreeMdl нельзя применять к мдл созданой с помощью MmCreateMdl.

    Короче не удивительно что у тебя синий экран получается :)
     
  16. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    >MmBuildMdlForNonPagedPool ни в коем случае нельзя использовать для мдл взятой от юзермодных адресов

    Я об этом догадывался, но типа так в "метОде" написано:)



    В ддк написано, что MmProbeAndLockPages может вызывать исключение, которое надо обязательно перехватить...

    А тут в одной книжке еслть пример как перехватывать:

    PVOID buffer = Irp->UserBuffer;

    ULONG length = stack->Parameters.Read.Length;

    if (Irp->RequestorMode != KernelMode)

    {

    __try

    {

    PMDL mdl = IoAllocateMdl(...);

    MmProbeAndLockPages(...);

    -or-

    ProbeForRead(...);

    <access memory at buffer>

    }

    __except(EXCEPTION_EXECUTE_HANDLER)

    {

    return CompleteRequest(Irp, GetExceptionCode(), 0);

    }

    Странно, но почему-то при компиляции не находится функция GetExceptionCode. Я раньше думал, что для того чтобы перехватывать системные исключения надо обязательно в IDT лазать...
     
  17. Narkoliga

    Narkoliga New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    19
    Адрес:
    С конопляного поля :)


    GetExceptionCode - это никакая не функция. На самом деле GetExceptionCode просто извлекает код исключения из структуры EXCEPTION_RECORD которая передается обработчику исключения.



    Для этого есть SEH, который работает также как и в ринг3. Но не все исключения в ринг0 им перехватываются. Необрабатываемыми являются исключения типа деления на ноль, page fault в nonpaged pool и.т.п. Вот если их нужно перехватывать, то тогда вперед в IDT, но лучше таких исключений просто избегать.
     
  18. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    В общем, я так вызываю теперь эти функции и получаю bsod:



    KeStackAttachProcess(pDE->pEPR,&ApcState);

    pDE->pUserMDL = IoAllocateMdl(pDE->KCT,10,FALSE,TRUE,NULL);

    MmProbeAndLockPages(pDE->pUserMDL,KernelMode,IoReadAccess);

    //pDE->Buffer = MmMapLockedPages(pDE->pUserMDL, KernelMode);



    //DbgPrint("UserBuffer[0]=%x\n",((ULONG*) pDE->Buffer)[0]);



    //MmUnmapLockedPages(pDE->Buffer,pDE->pUserMDL);

    MmUnlockPages(pDE->pUserMDL);

    IoFreeMdl(pDE->pUserMDL);

    KeUnstackDetachProcess(&ApcState);



    В данном случае BSOD получается по-видимому при исполнении MmProbeAndLockPages(pDE->pUserMDL,KernelMode,IoReadAccess);

    (Но!)Или у меня самого глюк произошел, но сколько-то BSOD-ов назад у меня не было BSOD-а при всех раскомментированных выражениях кроме DbgPrint("UserBuffer[0]=%x\n",((ULONG*) pDE->Buffer)[0]);

    Поясните, пожалуйста, что я не так ввожу? Это все у меня запускается в потоке. pDE->pEPR я получаю в DispatchIoControl routine: pDE->pEPR = IoGetRequestorProcess( pIrp );
     
  19. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    А какой код ошибки? Что говорит синий экран.
     
  20. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Первое число, которое не в скобках 0х7e

    Словами типа PAGE_FAULT_... ничего не написано. Че-та я не нахожу такого в xpddk, ща перепроверю шо он там выдает:)

    ...Проверил - опять 7е:)