|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 10, 2004 12:34:46 Привет! Как из kernel-mode изменить атрибуты защиты страниц, например, на PAGE_EXECUTE_READWRITE? Какая функция для этого нужна? ПАМАГИТЕ! Заранее благодарю. |
|
|
Дата: Авг 10, 2004 14:08:40 Если под ХР+, то MmProtectMdlSystemAddress. Если ниже, то вроде никак. В смысле через функции. Руками по PTE лазить надо. ЗЫ: PAGE_EXECUTE_READWRITE это обманка для юзера. На x86 это просто PAGE_READWRITE. |
|
|
Дата: Авг 10, 2004 14:13:16 Это я имел ввиду, если память в ядре. Если для юзерных адресов, ZwProtectVirtualMemory. |
|
|
Дата: Авг 10, 2004 15:32:31 Four-F ОГРОМНОЕ СПАСИБО! |
|
|
Дата: Авг 10, 2004 22:15:06 · Поправил: rsrc Все вроде у меня получилось, но когда делаю MDL для виртуального адреса user-mode процесса и если попадаю на секцию .rdata (только для чтения), то MmProbeAndLockPages() дает исключение, которое я даже на PASSIVE_LEVEL не могу обработать SEH’ом! Почему так происходит?
ULONG * pu = NULL;
PMDL pmdl;
pu = (ULONG*)(*(ULONG*)ioBuffer);
pmdl = MmCreateMdl(0, pu, sizeof(ULONG));
if(pmdl)
{
__try{
MmProbeAndLockPages(pmdl, KernelMode, IoModifyAccess);
pu = MmGetSystemAddressForMdl(pmdl);
if(pu && NT_SUCCESS(MmProtectMdlSystemAddress(pmdl, PAGE_READWRITE)))
{
*pu = 13;
}
MmUnlockPages(pmdl);
}
__except(EXCEPTION_EXECUTE_HANDLER){
}
IoFreeMdl(pmdl);
}
|
|
|
Дата: Авг 11, 2004 02:35:45 Если ты с юзерными адресами работаешь, на проще ли позвать ZwProtectVirtualMemory? |
|
|
Дата: Авг 11, 2004 19:28:02 Four-F Да, но ZwProtectVirtualMemory экспортируется ntdll.dll, которая находится в user-mode, а мне надо бы все делать из kernel-mode! |
|
|
Дата: Авг 11, 2004 22:29:27 Глянь таблицу экспорта в ntdll - там она уходит в SDT. А так как принцип вызова эдентичен везде, то просто глянь чё ложится в EAX перед Int 2Eh. И сам вызови её уже из ntoskrnl. Не очень то уж и геморно. Если уж прям суждено юзать только ZwProtectVirtualMemory. |
|
|
Дата: Авг 12, 2004 01:16:19 Блин, я забыл, что она ядром не экспортируется. |
|
|
Дата: Авг 12, 2004 01:31:28 Four-F Если бы не BSOD MmProbeAndLockPages() на секции токо для чтения, то MmProtectMdlSystemAddress() выручила бы меня! PavPS Но Руссинович пишет о том, что номера сервисов зависят от номера build’a Windows (их номера генерируются автоматически при компиляции ядра!) и поэтому мне int 2Eh (или SYSENTER) ничего не даст. |
|
|
Дата: Авг 12, 2004 01:41:55 Да нет, именно это я и имел ввиду, что ты сам должен малец дизасеммблить тот кусок кода, который стоит перед Int 2Eh. Ты должен глянуть, чё ложится в EAX ZwProtectVirtualMemory proc near ; CODE XREF: sub_0_77F5A981+69p .text:77F7EC43 ; sub_0_77F5A981+106p ... .text:77F7EC43 mov eax, 89h ; NtProtectVirtualMemory .text:77F7EC48 mov edx, 7FFE0300h .text:77F7EC4D call edx .text:77F7EC4F retn 14h .text:77F7EC4F ZwProtectVirtualMemory endp разбираешь опкод этого mov eax, 89h и вперед... Например я так вызаваю некоторые ф-ии сам, и пока - пашет на разных build-ах. А в то что вызов этой ф-ии изменит свою _сруктуру_, так это вроде революций никаких в MS нет. Вроде не должен. Ну для гарантии можно проверять по каким-нить сигнатурам. Короче, у меня пашет. |
|
|
Дата: Авг 12, 2004 01:52:20 PavPS Смотри, плз, у Руссиновича на стр. 100 Примечание! У меня тоже eax=89h, но если так сделать, то потом у кого-то мой драйвер может вызвать BSOD!!!! |
|
|
Дата: Авг 12, 2004 02:03:14 Еще'б я спорил... |
|
|
Дата: Авг 12, 2004 04:04:22 rsrc, а какова конечная цель? Если просто писАть из драйвера в юзерную память, то можно сбросить WP. А если именно изменить атрибуты памяти юзерных адресов, то MmProtectMdlSystemAddress тут, IMHO, не поможет, т.к. она вроде только с системными адресами работает. MmGetSystemAddressForMdl вернет тебе адрес в ядре, куда будет отображена пользовательская память. Вот для этой проекции ты и поменяешь атрибуты, а юзерные страницы как были так и останутся со старыми атрибутами. Если я всё правильно понимаю. |
|
|
Дата: Авг 12, 2004 15:07:23 Four-F Моя конечная цель это отображать (через MDL) в системное адресное пространство секции ресурсов (битмапы) user-модулей и потом из программных системных потоков выводить все это в видеопамять 25-кадром. И все хорошо, да вот только на секции только для чтения MmProbeAndLockPages() выдает BSOD и наверное придется при сборке exeшников эти секции делать RW. В user-mode невозможно сделать 25-кадр потому, что квант равен примерно 20 мс (показывать картинку надо примерно 42 мс и через 958 мс), а когда еще прога получит квант хз и поэтому возникает мерцание надписи типа “7 лет не пить!”. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.068 |