Не весь ntos модуль промаплен под w2k3

Тема в разделе "WASM.NT.KERNEL", создана пользователем genesis, 20 дек 2007.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а что тогда описывает кернел память? например промапленые файлы или выгруженные в своп страницы. должна же MmAccessFault различать невалидная ли это совсем PTE либо страница, Ей соответствующая, выгружена.
    можно конечно разобрать исходники, но я все никак не отважусь дочитать их до конца)
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    мм нагуглил интересную презентацию http://www.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/02-VirtualMemory/VirtualMemory.ppt
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а во в руссиновиче описаны форматы недействительных PTE.. чето я раньше их не видел там о_0
     
  4. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    Это которая Inside Microsoft Windows 2000?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    она самая,только щас версия поновее есть про ХР/2k/2k3
    ща пишу функцию которая будет парсить невалидные PTE
     
  6. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Так на всякий случай, незабудь проверить в режиме РАЕ(и без него разумеется) и когда страница 4 мега. Сам на эти грабли наступал.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А ну это есесно, PAE обязательно проверю ибо у меня на ноуте и на домашнем компе он включен. Пока что только пишу без него на вмваре, потом добавлю. Ну и large pages соотв. тоже

    Вообще уже получается довольно разумная проверка. На промапленую секцию возвращает true (в отличие от MmIsAddressValid), правда тип опреедляется как demand-zero page, а не как mapped section.

    странно както, вроде ифы скопипастил из ntos/mm/pagfault.c
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да кстати соответственно для тестирования встал вопрос - а как бы принудительно страничку в своп скинуть? чтобы проверить работу функции можно было. MiTrimAllSystemPageableMemory здорово конечно, тока хочется более норм. вариант
     
  9. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Я на виртуалке сделал такой конфиг

    [boot loader]
    timeout=30
    default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
    [operating systems]
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional PAE" /fastdetect /pae
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional PAE" /fastdetect /debugport=com1 /baudrate=115200 /pae
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional NO PAE" /fastdetect /nopae /noexecute=alwaysoff
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional NO PAE" /fastdetect /debugport=com1 /baudrate=115200 /nopae /noexecute=alwaysoff
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    чето на месте выгруженных в своп страниц, А так же промапленой секции стоит нулевой PTE

    кодес такой
    Код (Text):
    1. BOOLEAN MmIsAddressValidEx(PVOID Pointer)
    2. {
    3.     BOOLEAN Return = FALSE;
    4.  
    5.     MMPTE* Pde = MiGetPdeAddress(Pointer);
    6.  
    7.     KdPrint(("PDE is 0x%08x\n", Pde));
    8.     if( Pde->u.Hard.Valid )
    9.     {
    10.         KdPrint(("PDE entry is valid, PTE PFN=%08x\n", Pde->u.Hard.PageFrameNumber));
    11.  
    12.         MMPTE* Pte = MiGetPteAddress(Pointer);
    13.  
    14.         KdPrint(("PTE is 0x%08x\n", Pte));
    15.         if( Pte->u.Hard.Valid )
    16.         {
    17.             KdPrint(("PTE entry is valid, PFN=%08x\n", Pte->u.Hard.PageFrameNumber));
    18.             Return = TRUE;
    19.         }
    20.         else
    21.         {
    22.             //
    23.             // PTE is not valid
    24.             //
    25.  
    26.             MMPTE pte = *Pte;
    27.  
    28.             KdPrint(("Got invalid PTE [%08x]: Proto=%d,Transition=%d,Protection=0x%x,PageFilePFN=0x%x\n",
    29.                 pte.u.Long,
    30.                 pte.u.Soft.Prototype,
    31.                 pte.u.Soft.Transition,
    32.                 pte.u.Soft.Protection,
    33.                 pte.u.Soft.PageFileHigh));
    34.  
    35.             if( pte.u.Long )
    36.             {
    37.                 if( pte.u.Soft.Prototype == 1 )
    38.                 {
    39.                     //
    40.                     // Mapped file
    41.                     //
    42.  
    43.                     KdPrint(("PTE entry is not valid, points to mapped file.\n"));
    44.  
    45.                     Return = TRUE;
    46.                 }
    47.                 else  // not a prototype PTE
    48.                 {
    49.                     if( pte.u.Soft.Transition != 0 )
    50.                     {
    51.                         //
    52.                         // This is a transition page. Consider it invalid.
    53.                         //
    54.  
    55.                         KdPrint(("PTE entry is not valid, points to transition page.\n"));
    56.                     }
    57.                     else if (pte.u.Soft.PageFileHigh == 0)
    58.                     {
    59.                         //
    60.                         // Demand zero page
    61.                         //
    62.  
    63.                         KdPrint(("PTE entry is not valid, points to demand-zero page.\n"));
    64.  
    65.                         Return = TRUE; // this is a valid #PF (will NOT cause BSoD)
    66.                     }
    67.                     else
    68.                     {
    69.                         //
    70.                         // Pagefile PTE
    71.                         //
    72.  
    73.                         if( pte.u.Soft.Transition == 0 )
    74.                         {
    75.                             KdPrint(("PTE entry is not valid, VA is paged out (PageFile offset=%08x)\n",
    76.                                 pte.u.Soft.PageFileHigh));
    77.  
    78.                             Return = TRUE; // this is a valid #PF (will NOT cause BSoD)
    79.                         }
    80.                         else
    81.                         {
    82.                             KdPrint(("PTE entry is not valid, Refault\n"));
    83.                         }
    84.                     }
    85.                 }
    86.             }
    87.             else
    88.             {
    89.                 KdPrint(("PTE entry is completely invalid\n"));
    90.             }
    91.         }
    92.     }
    93.     else
    94.     {
    95.         KdPrint(("PDE entry is not valid\n"));
    96.     }
    97.  
    98.     return Return;
    99. }
    Для валидных PTE все нормально, а для невалидных почемуто нули.. как будто память не выделена
     
  11. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    Оно?

    Хм.Не знал.Но уже нашел.Спс.
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Inside Windows 2003
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    у меня на полке стоит. "Внутреннее устройство Windows Server 2003 Windows XP и Windows 2000"
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    TheDeath
    Что "оно" ? При чем тут PFN ?
     
  15. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    Дейс-но,фигню сморозил.
    А после того как промапил,ты к ней обращался?
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    нет, но дело не в том, если пте==0 (весь дворд=0) тогда это значит что либо память не выделена либо что она в VAD-ах описана. Тут как раз та фигня - ZwMapViewOfSection мапит на юзермод и описывает там память VADами..

    Короче вот получился рабочий вариант функи.
    Вывод дрова с комментами (на машине с PAE, на вмваре без пае вроде тож пашет)
    Код (Text):
    1. [~] DriverEntry()
    2. [~] Testing completely invalid address 0x86600000
    3. [+] MmIsAddressValid(86600000) = 0
    4. PDE is at 0xc0602198
    5. PDE entry is valid, PTE PFN=0000662b
    6. PTE is at 0xc0433000
    7. Got invalid PTE [000a9d3c00000000]
    8. PTE entry is completely invalid (page is not committed or is within VAD tree)
    9. [+] MmIsAddressValidEx(86600000) = 0
    10. Проверка совершенно неправильного адреса (чтобы взять этот адреса тупо берется nonpaged pool  и шагается постранично пока MmIsAddressValid не станет нулём. подкачиваемой памяти там быть не должно значит этот адрес вообще левый).
    11.  
    12. [~] Mapping physical address 0x0000000000012000
    13. [+] Mapped at f7c21000
    14. PDE is at 0xc0603df0
    15. PDE entry is valid, PTE PFN=00001066
    16. PTE is at 0xc07be108
    17. PTE entry is valid, PFN=00000012
    18. [~] MmIsAddressValidEx(f7c21000) = 1
    19. МАпится физадрес 0x12000 через MmMapIoSpace. вроде все норм.
    20.  
    21. [~] Mapping MDL
    22. [+] MDL mapped to VA 0xf7c1f000
    23. PDE is at 0xc0603df0
    24. PDE entry is valid, PTE PFN=00001066
    25. PTE is at 0xc07be0f8
    26. PTE entry is valid, PFN=00000012
    27. [~] MmIsAddressValidEx(f7c1f000) = 1
    28. [~] Unmapping
    29. Для промапленной физпамяти делается проекция вторая через MDL. у нее тот же PFN что и следовало ожидать..
    30.  
    31. [~] Mapping file
    32. CreateFileW: ZwCreateFile() = 00000000
    33. CreateSection: ZwCreateSection() = 00000000
    34. MapViewOfSection: ZwMapViewOfSection() = 00000000
    35. [+] File mapped at 0x00040000
    36. [+] MmIsAddressValid(00040000) = 0
    37. PDE is at 0xc0600000
    38. PDE entry is valid, PTE PFN=00006d80
    39. PTE is at 0xc0000200
    40. Got invalid PTE [0000000000000000]
    41. PTE entry is completely invalid (page is not committed or is within VAD tree)
    42. [+] MmIsAddressValidEx(00040000) = 0
    43. мапинг файлика в память (boot.ini) и проверка доступа на промапленные страницы. Как я понимаю, поскольку вид юзермодный то оно описано в VADах и тут лежит нулевой PTE
    44.  
    45. [~] Reading section
    46. [+] Read: 6f6f625b
    47. [+] MmIsAddressValid(00040000) = 1
    48. PDE is at 0xc0600000
    49. PDE entry is valid, PTE PFN=00006d80
    50. PTE is at 0xc0000200
    51. PTE entry is valid, PFN=00020ab2
    52. [+] MmIsAddressValidEx(00040000) = 1
    53. Попытка чтения секции.. адрес стал валидным (с точки зрения бита Valid у PTE)
    54.  
    55. [+] Allocated from paged pool at address 0xe1405000
    56. [~] MmIsAddressValid(e1405000) = 0
    57. PDE is at 0xc0603850
    58. PDE entry is valid, PTE PFN=0000705d
    59. PTE is at 0xc070a028
    60. Got invalid PTE [00000000000000c0]
    61. PTE entry is not valid, points to demand-zero page. Protection=6[MM_EXECUTE_READWRITE]
    62. [~] MmIsAddressValidExPae(e1405000) = 1
    63. Выделил страничку в подкачиваемом пуле. Видимо ей ставится demand-zero PTE, чтобы она обнулилась по первому обращению
    64.  
    65. [~] Writing to the page (it should become valid)
    66. [~] MmIsAddressValid(e1405000) = 1
    67. PDE is at 0xc0603850
    68. PDE entry is valid, PTE PFN=0000705d
    69. PTE is at 0xc070a028
    70. PTE entry is valid, PFN=00031f7b
    71. [~] MmIsAddressValidExPae(e1405000) = 1
    72. Записали в страничку, PTE стал валидным.
    73.  
    74. [~] Paging out all system pagable memory...
    75. [+] Done. Checking VA
    76. [+] MmIsAddressValid(e1405000) = 0
    77. PDE is at 0xc0603850
    78. PDE entry is valid, PTE PFN=0000705d
    79. PTE is at 0xc070a028
    80. Got invalid PTE [0000000031f7b8c2]
    81. PTE entry is not valid, points to transition page. PFN=31f7b, Protection=6[MM_EXECUTE_READWRITE]
    82. [+] MmIsAddressValidEx(e1405000) = 1
    83. [+] Driver initialization successful
    84. Через MmTrimAllSystemPagableMemory() странички отправляются в своп. Она стала transition - видимо реально страницы в своп не уходят, только помечаются как невалидные чтобы драйвера на проверку IRQL чекать
    http://gr8.cih.ms/uploads/mmvalid.h
     
  17. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    Great
    Это уже тянет на докторскую :))
    Только в одном случае может имхо пригодится - когда пишешь свой отладчик ядра
    В реал-лайфе тип памяти всегда известен и проблем с проверкой его валидности-доступности нету, только у новичков разве что
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    z0mailbox
    не сказал бы. когда дампить чтото надо например или когда вообще тулзу писать которая память просматривает, было бы неплохо знать можно обращаться к памяти или нельзя
     
  19. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Очень даже нужная вещь, во всяких секурных прогах например.
     
  20. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    Для дампа чего-то сложного вряд ли.Защита сама может поставить нулевой PTE/PDE и сама обрабатывать исключение.