Работал над созданием потока в юзермоде из r0. На форуме прочел Ms Rem'a о том, что при вызове ZwAllocateVirtuаlMemory, параметры *BaseAddress и AllocateSize должны находится в юзермодной памяти, иначе ничего не выйдет. Вызов фукнции GetUserMappedAddress успешно возвращает промаппленые адреса, но последующий вызов ZwAllocateVirtuаlMemory с этими адресами вываливается с 0xc0000005. Где ступил? Код (Text): PVOID GetUserMappedAddress(PMDL pMdl, PVOID arg, ULONG size) { pMdl = IoAllocateMdl(arg, size, FALSE, FALSE, NULL); MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess); return MmMapLockedPagesSpecifyCache(pMdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority); } ........................ PVOID result = ExAllocatePool(NonPagedPool, sizeof(USER_STACK)); PUSER_STACK stack = (PUSER_STACK)GetUserMappedAddress(pMdl, result, sizeof(USER_STACK)); result = ExAllocatePool(NonPagedPool, sizeof(ULONG)); PULONG alloc_size = (PULONG)GetUserMappedAddress(pMdl, result, sizeof(ULONG)); status = ZwAllocateVirtualMemory(hProcess, &stack->ExpandableStackBottom, 0, alloc_size, MEM_RESERVE, PAGE_READWRITE);
я весь код не показывал, для удобочитаемости, но с этим все в порядке Я уже нашел ошибку усе работает. Ступил вот здесь Код (Text): PULONG alloc_size = (PULONG)GetUserMappedAddress(pMdl, result, sizeof(ULONG)); alloc_size фактически находился в стеке ядра, поэтому ZwAllocateVirtualMemory и не могла определить 4-й параметр AllocateSize
можно вопрос если промэпить кусок ядерной памяти с помощью MmMapLockedPagesSpecifyCache в контексте чужого процесса KeStackAttachProcess/KeUnstackDetachProcess будет он доступен из ЮЗЕРМОД после KeUnstackDetachProcess ?
0x56 Думаю да. По идее ссылка на промаппленую память должна существовать до вызова MmUnlockPages и IoFreeMdl
не обязательно в юзермодной части адреса в параметрах находиться должны (если через int 2e вызываешь - адреса в параметрах могут быть ядерными, ибо PreviousMode устанавливается в KernelMode) - а в противном случае (если, скажем, из хука вызываешь прямой обработчик ZwAllocateVirtualMemory который в SDT лежит) - PreviousMode у тебя стоит в UserMode и потому обработчик все проверяет. (MM_HIGHEST_USER_ADDRESS если не ошибаюсь навскидку)
ECk Да, знаю. Просто я мудохался, прошу прощения за грубое слово, с созданием стека юзермодного потока из ядра, а там 2 и 4 аргументы ZwAllocateVirtualMemory под стек должны лежать в юзермоде (при вызове функции из SST напрямую, ядром на не экспортируется).
Есть фнукции, которые чекают адреса на валидность в юзермоде независимо от KeGetPreviousMode Будет. Мапирование, фактически, создает ссылку на ту же физическую страницу.