сквозной патч всех процессов (таблица страниц)

Тема в разделе "WASM.WIN32", создана пользователем valinor, 12 июн 2005.

  1. valinor

    valinor New Member

    Публикаций:
    0
    Регистрация:
    7 май 2005
    Сообщения:
    27
    Есть задачка - из Ring0 пропатчить пользовательскую DLL, загруженную в текущий процесс (например, kernel32.dll).

    При этом нужно не допустить срабатывания механизма copy-on-write. DLL должна пропатчиться во всех процессах.



    Как это сделать, понятно - надо

    - узнать физический адрес пропатчиваемого места

    - добавить в таблицу страниц текущего процесса запись с правом записи на этот физадрес

    - пропатчить по _новому_ линейному(в виндах == виртуальному) адресу. получим сквозной патч всех процессов.



    Я попробовал это сделать, находя свободные слоты в PDE и PTE и записывая в них записи с теми же параметрами, что и в оригинальных записях (кроме флага RW). Однако нового виртуального адреса не появляется.



    Знающие люди, подскажите в чем ошибка.

    Код следующий:


    Код (Text):
    1.  
    2. #define dbg DbgPrint
    3. int writetomemory(void *virtaddr, void *buf, ULONG size)
    4. {
    5.     ULONG i, k;
    6.     int r = 1;
    7.     if(!MmIsAddressValid(virtaddr))
    8.         return r;
    9.     PHYSICAL_ADDRESS physaddr = MmGetPhysicalAddress(virtaddr);
    10.     PHYSICAL_ADDRESS pa;
    11.     void *la;
    12.  
    13.     PX86_PE pde0 = (PX86_PE)(0xc0300000+
    14.         (((ULONG)virtaddr & 0xffc00000)>>20));
    15.     PX86_PE pte0 = (PX86_PE)(0xc0000000+
    16.         (((ULONG)virtaddr & 0x003ff000)>>10));
    17.     PX86_PE pde = (PX86_PE)0xc0300000;
    18.     PX86_PE pte = (PX86_PE)0xc0000000;
    19.     if(!MmIsAddressValid(pde0) || !MmIsAddressValid(pte0))
    20.         return r;
    21.     // search for free PDE
    22.     for(i=0; i<1024; i++, pde++)
    23.     {
    24.         if(MmIsAddressValid(pde) && pde->pnpe.P == 0)
    25.         {
    26.             dbg("&pde=%08x\n", pde);
    27.             // search for free PTE
    28.             for(k = 0; k < 0x300000/4; k++, pte++)
    29.                 if(MmIsAddressValid(pte) && pte->pnpe.P == 0)
    30.                 {
    31.                     dbg("&pte=%08x\n", pte);
    32.                     // add new PDE & PTE
    33.                     // get phys address of PTE page
    34.                     pa = MmGetPhysicalAddress((void*)
    35.                         (0xfffff000 & (ULONG)pte) );
    36.                     __asm cli
    37.                     pde->pde4K.P = pde0->pde4K.P;
    38.                     pde->pde4K.RW = 1;
    39.                     pde->pde4K.US = pde0->pde4K.US;
    40.                     pde->pde4K.PWT = pde0->pde4K.PWT;
    41.                     pde->pde4K.PCD = pde0->pde4K.PCD;
    42.                     pde->pde4K.A = pde0->pde4K.A;
    43.                     pde->pde4K.Reserved = pde0->pde4K.Reserved;
    44.                     pde->pde4K.PS = pde0->pde4K.PS;
    45.                     pde->pde4K.G = pde0->pde4K.G;
    46.                     pde->pde4K.Available = pde0->pde4K.Available;
    47.  
    48.                     pde->pde4K.PFN = pa.LowPart >> 12; // PDE -> PTE page
    49.                    
    50.                     pte->pte4K.Available = 0;
    51.                     pte->pte4K.G = pte0->pte4K.G;
    52.                     pte->pte4K.P = pte0->pte4K.P;
    53.                     pte->pte4K.RW = 1;
    54.                     pte->pte4K.US = pte0->pte4K.US;
    55.                     pte->pte4K.PWT = pte0->pte4K.PWT;
    56.                     pte->pte4K.PCD = pte0->pte4K.PCD;
    57.                     pte->pte4K.A = pte0->pte4K.A;
    58.                     pte->pte4K.D = pte0->pte4K.D;
    59.                     pte->pte4K.Reserved = 0;
    60.                    
    61.                     pte->pte4K.PFN = physaddr.LowPart >> 12;
    62.                    
    63.                     __asm sti
    64.  
    65.                     dbg("new PDE=%08x, PTE=%08x\n",
    66.                         pde->dValue, pte->dValue);
    67.                    
    68.                     // calc LA
    69.                     la = (void*)((i<<22)|(k<<12)|(0x00000fff & (ULONG)virtaddr));
    70.                     dbg("Linear address=%08x\n", la);
    71.                     // write data
    72. //                  memcpy(la, virtaddr, size); // doesn't work!!!
    73.                     r = 0;
    74.                 }
    75.         }
    76.     }
    77.     return r;
    78. }
    79.  
     
  2. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    valinor

    так, во ппервых, тебе нужно что , просто изменить несколько байтов или дописать кусок кода в либу ???? если последнее, то ищи свободное место в модуле и дописывай туда код из драйвера, убрав бит WP, изменения отобразятся во всех контекстах.