Шалости с PTE, PDE, GDT, IDT и др

Тема в разделе "WASM.NT.KERNEL", создана пользователем _Serega_, 9 окт 2006.

  1. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    1. Можно ли вручную и безболезненно(Like Ms-Rem) менять PTE, PDE, GDT, IDT, или винде от этого плохо будет. (Ведь винда может дублировать данные, например).
    2. Каким образом, опять-же вручную, сопоставить PID процесса с его PDT. (2К, NТ)

    Объясните ламеру. Заранее спасибо.
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Можно. Но у меня возникли проблемы на SMP машинах (см http://www.wasm.ru/forum/viewtopic.php?id=16449). С GDT и IDT проблем вообще нет, можно безбоязненно брать код Ms-Rem.

    По PID процесса можно получить указатель на KPROCESS. Там есть поле "ULONG_PTR DirectoryTableBase[2]" (у меня на Win2000 по смещению 0x18). В первом элементе находится виртуальный адрес PDT

    ЗЫ: Правда PDT находится в юзер-модной части памяти и указатель валиден только в контексте соответсвующего процесса
     
  3. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    2gilg Спасибо.

    Правда я не понял:
    Объясни поподробнее пожалуйста. Судя по значениям, PIDы похожи на смещения от базы какой-то. Что за базовый адрес? И что, по этому адресу лежит указатель на KPROCESS? (Просто все нужно сделать без АПИ)

    Если он нах-ся в юзер-модной части(т.е. DPL=3 как я понял) то его можно найти (угадать, распознать по похожести и др.) и промодифицировать? Не верю. Этож такая дыра!

    Меня больше смущало другое. Если я модифицирую, например, PTE который раньше был связан с Memory Mapping File не будет ли системе BSOD из за того что именно про этот участок памяти система была уверена что у него другие атрибуты (где-то их закешировала или продублировала). Т.Е. не была предусмотрена возможность модификации данных в обход АПИ.
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Функция NTSTATUS PsLookupProcessByProcessId(IN PVOID ProcessId, OUT PEPROCESS *Process)

    Херь какую-то я сказал, бррр, сам теперь понять не могу :) На самом деле в DirectoryTableBase находится физический адрес PDT, соотоветственно, получить виртуальный адрес можно с помощью MmGetVirtualForPhysical(DirectoryTableBase[0]). Он естественно находится в ядерной области памяти. Windows 2000 маппит PDT на адрес 0xc0300000, а таблицу страниц на 0xc0000000.

    Перед модификацией обязательно нужно блокировать прерывания. После изменения PTE нужно выполнить инструкцию "invlpg <виртуальный адрес на модифицированной странице>". Эта инструкция сбрасывает страничный кэш процессора. Еще в интеловских доках говорится, что на всех процессорах таблицы страниц должны полностью совпадать, т.е. модифицировать PTE нужно на всех процессорах. К чему могут привести различия не знаю, вероятно, могут быть проблемы с синхронизацией процессоров при обращениях к памяти.
     
  5. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Осталось только PsLookupProcessByProcessId отреверсить. А так все понятно.
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Эта функция просто берет указатель по индексу ProcessID из таблицы PspCidTable. Про эту таблицу что-то было в статьях Ms-Rem`а. А зачем хочешь делать все вручную, чем не нравится простой вызов этой функции?
     
  7. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Вызов хоть и простой, но придется резолвить адрес ф-ции, а он (алгоритм резолвинга) для моего случая будет отличаться от Ms-Rem`вского. Имхо.
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Ты шел-код пишешь? Тогда понятно...
    Код из статьи Ms-Rem`а по поиску PspCidTable.
    Код (Text):
    1. void GetPspCidTable()
    2. {
    3.     PUCHAR cPtr, pOpcode;
    4.     ULONG Length;
    5.  
    6.     for (cPtr = (PUCHAR)PsLookupProcessByProcessId;
    7.          cPtr < (PUCHAR)PsLookupProcessByProcessId + PAGE_SIZE;
    8.              cPtr += Length)
    9.     {
    10.         Length = SizeOfCode(cPtr, &pOpcode);
    11.  
    12.         if (!Length) break;
    13.  
    14.         if (*(PUSHORT)cPtr == 0x35FF && *(pOpcode + 6) == 0xE8)
    15.         {
    16.             PspCidTable = **(PVOID **)(pOpcode + 2);
    17.             break;
    18.         }
    19.     }
    20. }
    Там же http://www.wasm.ru/article.php?article=hiddndt разобран формат таблицы для w2k и wxp
     
  9. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Пока все на стадии планирования и разработки интерфейсов. Да и не шел это будет в чистом виде, а так, экстендер для отладчиков ринг-3. Может когда-нибудь как либу выложу :) Просто как драйвер организовывать не интересно, вот и играюсь с низким интерфейсом.