Резет при изменении записи каталога страниц.

Тема в разделе "WASM.NT.KERNEL", создана пользователем Velheart, 17 ноя 2008.

  1. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Хочу засунуть браузер в "песочницу", полностью контролируя обращение к файлам и создание процессов/потоков.
    Появилась следующая идея: чтобы не тормозить хуками всю систему, в целевом процессе подменить записи в каталоге/таблице страниц для того, чтобы хук стоял в ядре, но только в конкретном процессе. Если менять записи для двух свежевыделенных буфферов с данными, все замечательно работает, а следующий код, пытающийся заменить страницу с NtCreateFile приводит просто к перезагрузке без бсодов и т.д.:
    Код (Text):
    1. newPage = ExAllocatePool(NonPagedPool, 0x200000);
    2.    
    3.     oldPage = (PVOID)NtCreateFile;
    4.  
    5.     offset = ((ULONG)oldPage & (0x200000 - 1));
    6.     (PUCHAR)oldPage -= offset;
    7.  
    8.    
    9.     memcpy(newPage, oldPage, 0x200000);
    10.  
    11.     //*((PUCHAR)newPage + offset) = 0xCC;
    12.    
    13.     newPDE.QuadPart = *(PLONGLONG)MiGetPdeAddressPae(newPage);
    14.     DbgPrint("NewPde: %X %X\n", newPDE.HighPart, newPDE.LowPart);
    15.     oldPde = (PLARGE_INTEGER)MiGetPdeAddressPae(oldPage);
    16.    
    17.     /*
    18.     __try
    19.     {
    20.         mdl = MmCreateMdl(NULL, oldPage, 0x200000);
    21.         MmProbeAndLockPages(mdl, KernelMode, IoReadAccess);
    22.     }
    23.     __except(EXCEPTION_EXECUTE_HANDLER)
    24.     {
    25.         ExFreePool(newPage);
    26.         DbgPrint("Error!\n");
    27.         return;
    28.     }
    29.     */
    30.     oldValue = *oldPde;
    31.     DbgPrint("OldPde: %X %X\n", oldValue.HighPart, oldValue.LowPart);
    32.  
    33.     oldValue.LowPart &= (0x200000 - 1);
    34.     newPDE.LowPart &= ~(0x200000 - 1);
    35.     newPDE.LowPart |= oldValue.LowPart;
    36.  
    37.     DbgPrint("Phys: %X\n", MmGetPhysicalAddress(oldPde).LowPart);
    38.  
    39.     DisablePP();
    40.     __asm cli;
    41.     *oldPde = newPDE;
    42.     __asm push eax;
    43.         __asm mov eax, CR3
    44.         __asm mov CR3, eax
    45.     __asm pop eax;
    46.     __asm sti;
    47.     EnablePP();
    Я точно знаю что это не из-за:
    1) несоответствия размера страниц(кстати, можно ли гарантированно выделить большую/маленькую страницу?)
    2) валидности/невалидности страницы.

    Если трассировать код сисером все виснет на секунду после замены записи в каталоге страниц и все равно ребут.
    Кто-нибудь знает можно ли как-нибудь это побороть?
     
  2. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Может у кого-нибудь есть предположения хотя бы какие-нибудь? =(
    На vmware 6.0 тоже ребут, на 6.05 -- говорит: ошибка, плиз, сенд и т.д.