Хочу засунуть браузер в "песочницу", полностью контролируя обращение к файлам и создание процессов/потоков. Появилась следующая идея: чтобы не тормозить хуками всю систему, в целевом процессе подменить записи в каталоге/таблице страниц для того, чтобы хук стоял в ядре, но только в конкретном процессе. Если менять записи для двух свежевыделенных буфферов с данными, все замечательно работает, а следующий код, пытающийся заменить страницу с NtCreateFile приводит просто к перезагрузке без бсодов и т.д.: Код (Text): newPage = ExAllocatePool(NonPagedPool, 0x200000); oldPage = (PVOID)NtCreateFile; offset = ((ULONG)oldPage & (0x200000 - 1)); (PUCHAR)oldPage -= offset; memcpy(newPage, oldPage, 0x200000); //*((PUCHAR)newPage + offset) = 0xCC; newPDE.QuadPart = *(PLONGLONG)MiGetPdeAddressPae(newPage); DbgPrint("NewPde: %X %X\n", newPDE.HighPart, newPDE.LowPart); oldPde = (PLARGE_INTEGER)MiGetPdeAddressPae(oldPage); /* __try { mdl = MmCreateMdl(NULL, oldPage, 0x200000); MmProbeAndLockPages(mdl, KernelMode, IoReadAccess); } __except(EXCEPTION_EXECUTE_HANDLER) { ExFreePool(newPage); DbgPrint("Error!\n"); return; } */ oldValue = *oldPde; DbgPrint("OldPde: %X %X\n", oldValue.HighPart, oldValue.LowPart); oldValue.LowPart &= (0x200000 - 1); newPDE.LowPart &= ~(0x200000 - 1); newPDE.LowPart |= oldValue.LowPart; DbgPrint("Phys: %X\n", MmGetPhysicalAddress(oldPde).LowPart); DisablePP(); __asm cli; *oldPde = newPDE; __asm push eax; __asm mov eax, CR3 __asm mov CR3, eax __asm pop eax; __asm sti; EnablePP(); Я точно знаю что это не из-за: 1) несоответствия размера страниц(кстати, можно ли гарантированно выделить большую/маленькую страницу?) 2) валидности/невалидности страницы. Если трассировать код сисером все виснет на секунду после замены записи в каталоге страниц и все равно ребут. Кто-нибудь знает можно ли как-нибудь это побороть?
Может у кого-нибудь есть предположения хотя бы какие-нибудь? =( На vmware 6.0 тоже ребут, на 6.05 -- говорит: ошибка, плиз, сенд и т.д.