1. Можно ли вручную и безболезненно(Like Ms-Rem) менять PTE, PDE, GDT, IDT, или винде от этого плохо будет. (Ведь винда может дублировать данные, например). 2. Каким образом, опять-же вручную, сопоставить PID процесса с его PDT. (2К, NТ) Объясните ламеру. Заранее спасибо.
Можно. Но у меня возникли проблемы на SMP машинах (см http://www.wasm.ru/forum/viewtopic.php?id=16449). С GDT и IDT проблем вообще нет, можно безбоязненно брать код Ms-Rem. По PID процесса можно получить указатель на KPROCESS. Там есть поле "ULONG_PTR DirectoryTableBase[2]" (у меня на Win2000 по смещению 0x18). В первом элементе находится виртуальный адрес PDT ЗЫ: Правда PDT находится в юзер-модной части памяти и указатель валиден только в контексте соответсвующего процесса
2gilg Спасибо. Правда я не понял: Объясни поподробнее пожалуйста. Судя по значениям, PIDы похожи на смещения от базы какой-то. Что за базовый адрес? И что, по этому адресу лежит указатель на KPROCESS? (Просто все нужно сделать без АПИ) Если он нах-ся в юзер-модной части(т.е. DPL=3 как я понял) то его можно найти (угадать, распознать по похожести и др.) и промодифицировать? Не верю. Этож такая дыра! Меня больше смущало другое. Если я модифицирую, например, PTE который раньше был связан с Memory Mapping File не будет ли системе BSOD из за того что именно про этот участок памяти система была уверена что у него другие атрибуты (где-то их закешировала или продублировала). Т.Е. не была предусмотрена возможность модификации данных в обход АПИ.
Функция NTSTATUS PsLookupProcessByProcessId(IN PVOID ProcessId, OUT PEPROCESS *Process) Херь какую-то я сказал, бррр, сам теперь понять не могу На самом деле в DirectoryTableBase находится физический адрес PDT, соотоветственно, получить виртуальный адрес можно с помощью MmGetVirtualForPhysical(DirectoryTableBase[0]). Он естественно находится в ядерной области памяти. Windows 2000 маппит PDT на адрес 0xc0300000, а таблицу страниц на 0xc0000000. Перед модификацией обязательно нужно блокировать прерывания. После изменения PTE нужно выполнить инструкцию "invlpg <виртуальный адрес на модифицированной странице>". Эта инструкция сбрасывает страничный кэш процессора. Еще в интеловских доках говорится, что на всех процессорах таблицы страниц должны полностью совпадать, т.е. модифицировать PTE нужно на всех процессорах. К чему могут привести различия не знаю, вероятно, могут быть проблемы с синхронизацией процессоров при обращениях к памяти.
Эта функция просто берет указатель по индексу ProcessID из таблицы PspCidTable. Про эту таблицу что-то было в статьях Ms-Rem`а. А зачем хочешь делать все вручную, чем не нравится простой вызов этой функции?
Вызов хоть и простой, но придется резолвить адрес ф-ции, а он (алгоритм резолвинга) для моего случая будет отличаться от Ms-Rem`вского. Имхо.
Ты шел-код пишешь? Тогда понятно... Код из статьи Ms-Rem`а по поиску PspCidTable. Код (Text): void GetPspCidTable() { PUCHAR cPtr, pOpcode; ULONG Length; for (cPtr = (PUCHAR)PsLookupProcessByProcessId; cPtr < (PUCHAR)PsLookupProcessByProcessId + PAGE_SIZE; cPtr += Length) { Length = SizeOfCode(cPtr, &pOpcode); if (!Length) break; if (*(PUSHORT)cPtr == 0x35FF && *(pOpcode + 6) == 0xE8) { PspCidTable = **(PVOID **)(pOpcode + 2); break; } } } Там же http://www.wasm.ru/article.php?article=hiddndt разобран формат таблицы для w2k и wxp
Пока все на стадии планирования и разработки интерфейсов. Да и не шел это будет в чистом виде, а так, экстендер для отладчиков ринг-3. Может когда-нибудь как либу выложу Просто как драйвер организовывать не интересно, вот и играюсь с низким интерфейсом.