Операции с памятью загруженных драйверов

Тема в разделе "WASM.NT.KERNEL", создана пользователем Entropy, 9 мар 2021.

  1. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    266
    Здрасти,как вам известно для юзермода есть функции для чтения и записи в память процесса(Read\WriteProcessMemory),так возникает вопрос,может ли загруженный драйвер читать и записывать память других драйверов ? очень интересно будет рассмотреть реализацию этого
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.363
    Ты путаешь процессы и ядро, у каждого процесса своя виртуальная память, память ядра образно одна, драйвер может писать что угодно, куда угодно, главное в бсод систему не уронить.
     
  3. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    266
    то есть надо отследить адрес куда загружен драйвер ?
    --- Сообщение объединено, 9 мар 2021 ---
    но также нужно учитывать атрибуты памяти
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.363
    Ты хочешь пропатчить код другого драйвера или что?
     
  5. X-Shar

    X-Shar Active Member

    Публикаций:
    0
    Регистрация:
    24 фев 2017
    Сообщения:
    349
    А ядро это позволит, пачгарды всякие и т.д. ?
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.787
    Rel,

    > память ядра образно одна

    На самом деле это не так, есть сессии где память ядра не общая. Изменяются таблицы адресной трансляции MiAttachSession() etc. Адрес может одинаковым быть, а значение по нему разное. Так отображается гуй в ядро каждой сессии.

    Entropy,

    > отследить адрес куда загружен драйвер ?

    Есть такая интернал функция MmEnumerateSystemImages(). Подключается к сессии, получает инфу про образ, дальше перечисляет сессии и образы.

    > может ли загруженный драйвер читать и записывать память других драйверов ?

    В юзер манипуляции адресами проходят через VAD, в ядре через MDL. Что это такое можешь почитать у Рихтера или есчо где то тут например.
     
  7. cddee3

    cddee3 Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2020
    Сообщения:
    55
    На самом деле это не так, если работает Hyper-V с включенным VBS то будут два ядра ntoskrnl.exe и securekernel.exe
    securekernel.exe будет в защищенном мире VTL1 доступ к нему блокируется гипервизором на уровне SLAT, но адресное пространство - общее
     
    k3rnl нравится это.
  8. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    266
    откуда такая инфа ? сурки wrk или таблица экспорта ?
    --- Сообщение объединено, 12 мар 2021 ---
    нет,меня интересует чтение памяти
    --- Сообщение объединено, 12 мар 2021 ---
    пачгард это совсем другое,он не контролирует целостность загруженных драйверов
     
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.787
    Entropy,

    > откуда такая инфа ?

    Так дебаг символы любой диз обрабатывает, идой открыл да посмотрел. Это в несколько кликов мышем конечно, наверно вопрос как это найти - я не первый месяц в кернел там неплохо ориентируюсь. Без аттача к сессиям образу ты не перечислишь. Если большое количество экспортных апи, в юзер например я предпочтительно использовал RtlWalkFrameChain() тк это табличные решения не блокирующие поток, в ядре вариков больше. Там всё упирается как ты сможешь найти символьную апи, тоесть там есть всё но оно не паблик что значит не внесено в экспорт.
    --- Сообщение объединено, 12 мар 2021 ---
    > нет,меня интересует чтение памяти

    Ты не описал проблему с чтением, рано походу тебе в ядро лезть покури архитектуру пару лет(ты можешь тупо что то копипастить сбилдить оно упадёт но отладить ты это не сможешь, затем тупо кинешь потратив очень много времени, так у всех было новичков) :)
     
  10. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    266
    уже не успею,нельзя исключать что архитектура с течением времени будет усложняться,думаю для ознакомления эти пару лет подойдут
     
    Indy_ нравится это.
  11. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.787
    Entropy,

    Да, это можно назвать проблемой вхождения". Попытка догнать поезд.
     
    M0rg0t нравится это.
  12. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.236
    если отрубить "защитные" рюшечки, то дравер обретает силу былых времён. к тому же, скорость софта заметно растёт :)
     
  13. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    266
    а если подробнее и как это относится к этой теме ?
     
  14. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.236
    так тебе на какую вынь нужны дрова и цель этих дров?
     
  15. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    266
    вынь 7,цели: чтение памяти других загруженных дров
     
  16. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    266
    я смотрю в каждом файле драйвера имеется секция .reloc,то есть драйвер грузится явно не по базе,у меня возникает такой вопрос, драйвер загружается за пределы адресного пространства ядра или в его пределах ?
     
  17. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.502
    Адрес:
    Россия, Нижний Новгород
    Грузится в адресное пространство ядра и становится виден всем процессам по одинаковому ядерному адресу.
    В контексте какого бы процесса ты ни находился, драйвер всегда будет доступен по одному и тому же адресу.
    Поэтому, если отвечать на твой изначальный вопрос в теме, если знаешь адрес памяти, которую хочешь поменять, то можешь её читать и менять напрямую через обычное разыменовывание указателя, как если бы ты менял память своего собственного процесса.
    Код (C):
    1.  
    2. uint8_t data = *(uint8_t*)адрес_ядерной_памяти;
    3. *(uint8_t*)адрес_ядерной_памяти = 123;
    4.  
    ...или через memcpy/memset.
    Если же тебе надо поменять память, которая ReadOnly, тебе предварительно нужно сделать её записываемой.
    Прямого аналога VirtualProtect в ядре нет, но есть другой способ: ты можешь создать записываемое отображение на ту же физическую память, на которую смотрит твой виртуальный адрес.
    Для этого нужно вызвать функции: IoAllocateMdl -> MmProbeAndLockPages -> MmMapLockedPagesSpecifyCache -> MmProtectMdlSystemAddress(mdl, PAGE_READWRITE).
    После этого ты получишь ДРУГОЙ виртуальный адрес, который смотрит на ту же физическую память, что и твой желаемый, и через это "окошко" ты уже сможешь изменить ReadOnly-память (тоже через обычное разыменовывание указателей или через memcpy).

    Но существуют компоненты, которые живут в так называемом "session space": это кусочки пространства ядра, которые уникальны для каждой пользовательской сессии.
    Такие кусочки доступны по одним и тем же ядерным адресам только в процессах, созданных внутри одной сессии, и из других сессий по этим адресам будет видно что-то другое.
    В таком сессионном пространстве, например, живут компоненты графической системы (win32k.sys и подобные).
    Чтобы менять session space память, тебе предварительно нужно переключиться в контекст процесса, который был создан в нужной сессии, используя KeStackAttachProcess.
     
  18. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    266
    HoShiMin, есть user mode функция EnumDeviceDrivers() из Process Status API ,она перечисляет адреса всех драйверов системы,значит если будет известен виртуальный адрес загруженного драйвера,возможно ли из режима ядра получить к нему доступ без IoAllocateMdl -> MmProbeAndLockPages -> MmMapLockedPagesSpecifyCache -> MmProtectMdlSystemAddress(mdl, PAGE_READWRITE) и всего прочего ?
     
  19. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.502
    Адрес:
    Россия, Нижний Новгород
    Entropy, да: на чтение или запись записываемых страниц через обычный memcpy, для записи в незаписываемые страницы через ту портянку функций.
     
  20. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    308
    Что может быть интересного в памяти драйверов? Зачем её читать, тем более записывать в неё? Внедрять свой шелл, если ты и так находишься в ядре? Понимаю, если читать/править структуру EPROCESS драйвера, но она лежит не в его памяти. Если сильно интересно, можно элементарно сдампить любую область драйвера на текущий момент в отладчике WinDbg (livekd). Макс что найдёте в секции данных - это какие нибудь служебные структуры, а остальное код, который так-же можно дизассемблировать в дебагере. Какая у вас конечная цель? Вот пример, как просмотреть память любого драйвера:

    1. Находим базу всех командой lmnM *.sys
    2. Читаем РЕ-заголовок !dh baseAddress, чтобы получить адрес секции .data, или любой другой
    3. Командой db address L size дампим данные, или uf funcName/address если нужен дизам.листинг кода

    Код (Text):
    1.  
    2. 0: kd> lmnM *.sys
    3. start              end                 module name
    4. fffff880`00c00000  fffff880`00c2a000   ataport.sys
    5. fffff880`00c2a000  fffff880`00c3a000   pciidex.sys
    6. fffff880`00cc2000  fffff880`00d22000   clfs.sys
    7. fffff880`00d97000  fffff880`00df3000   volmgrx.sys
    8. fffff880`00e00000  fffff880`00e0c000   battc.sys
    9. fffff880`00e0c000  fffff880`00e20000   volmgr.sys
    10. fffff880`00e20000  fffff880`00e3a000   mountmgr.sys
    11. fffff880`00e3a000  fffff880`00e43000   atapi.sys
    12. ..............
    13.  
    14. 0: kd> !dh -s fffff880`00c00000   <--- Возьмём первый ataport.sys
    15. SECTION HEADER #1
    16.    .text  name
    17.    12A9C  virtual size
    18.     1000  virtual address
    19.    12C00  size of raw data
    20.      400  file pointer to raw data
    21.        0  file pointer to relocation table
    22.        0  file pointer to line numbers
    23.        0  number of relocations
    24.        0  number of line numbers
    25. 68000020  flags:  Code, Not Paged, Execute Read
    26.  
    27. SECTION HEADER #3
    28.    .data  name
    29.      5FC  virtual size      ;<-------- размер секции-данных
    30.    16000  virtual address   ;<-------- и её адрес
    31.      200  size of raw data
    32.    14800  file pointer to raw data
    33.        0  file pointer to relocation table
    34.        0  file pointer to line numbers
    35.        0  number of relocations
    36.        0  number of line numbers
    37. C8000040  flags: Initialized Data, Not Paged, Read Write  ;<---- доступна на запись!
    38. .............
    39.  
    40. 0: kd> db fffff880`00c00000 + 16000 L 0x5fc
    41. fffff880`00c16000  00 00 00 00 00 01 00 00-00 00 00 00 00 00 00 00  ................
    42. fffff880`00c16010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    43. ...........
    44. fffff880`00c160e0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    45. fffff880`00c160f0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    46. fffff880`00c16100  32 a2 df 2d 99 2b 00 00-cd 5d 20 d2 66 d4 ff ff  2..-.+...] .f...
    47. fffff880`00c16110  10 3a c1 00 80 f8 ff ff-e8 47 c1 00 80 f8 ff ff  .:.......G......
    48. fffff880`00c16120  01 00 00 00 00 00 00 00-a0 61 c1 00 80 f8 ff ff  .........a......
    49. fffff880`00c16130  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    50. fffff880`00c16140  40 17 63 02 00 f8 ff ff-94 da 2b 02 00 f8 ff ff  @.c.......+.....
    51. fffff880`00c16150  f0 10 64 02 00 f8 ff ff-d0 e6 65 02 00 f8 ff ff  ..d.......e.....
    52. fffff880`00c16160  50 83 32 02 00 f8 ff ff-04 00 00 00 00 00 00 00  P.2.............
    53. fffff880`00c16170  00 00 00 00 00 00 00 00-1f 00 00 00 00 00 00 00  ................
    54. fffff880`00c16180  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    55. fffff880`00c16190  18 4a c1 00 80 f8 ff ff-01 00 00 00 00 00 00 00  .J..............
    56. fffff880`00c161a0  00 00 00 00 00 00 00 00-d8 47 c1 00 80 f8 ff ff  .........G......
    57. fffff880`00c161b0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    58. fffff880`00c161c0  00 00 00 00 00 00 00 00-01 00 00 00 00 00 00 00  ................
    59. fffff880`00c161d0  00 00 00 00 00 00 00 00-1e 00 00 00 00 00 00 00  ................
    60. fffff880`00c161e0  10 c9 4b 02 00 f8 ff ff-78 58 f0 00 80 f8 ff ff  ..K.....xX......
    61. fffff880`00c161f0  dc 20 c0 00 80 f8 ff ff-20 36 c1 00 80 f8 ff ff  . ...... 6......
    62. fffff880`00c16200  fe 56 81 01 00 f1 ff ff-02 00 00 00 01 00 00 00  .V..............
    63. fffff880`00c16210  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    64. fffff880`00c16220  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    65. ...........
    66. fffff880`00c16300  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    67. fffff880`00c16310  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    68. fffff880`00c16320  3c 18 c2 00 80 f8 ff ff-3c 18 c2 00 80 f8 ff ff  <.......<.......
    69. fffff880`00c16330  b4 6d c0 00 80 f8 ff ff-84 6d c0 00 80 f8 ff ff  .m.......m......
    70. fffff880`00c16340  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    71. fffff880`00c16350  94 67 c0 00 80 f8 ff ff-0c 6c c0 00 80 f8 ff ff  .g.......l......
    72. fffff880`00c16360  e8 0b c2 00 80 f8 ff ff-e8 0b c2 00 80 f8 ff ff  ................
    73. fffff880`00c16370  e8 0b c2 00 80 f8 ff ff-e8 0b c2 00 80 f8 ff ff  ................
    74. fffff880`00c16380  e8 0b c2 00 80 f8 ff ff-e8 0b c2 00 80 f8 ff ff  ................
    75. fffff880`00c16390  e8 0b c2 00 80 f8 ff ff-e8 0b c2 00 80 f8 ff ff  ................
    76. fffff880`00c163a0  e8 0b c2 00 80 f8 ff ff-e8 0b c2 00 80 f8 ff ff  ................
    77. fffff880`00c163b0  e8 0b c2 00 80 f8 ff ff-e8 0b c2 00 80 f8 ff ff  ................
    78. fffff880`00c163c0  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    79. fffff880`00c163d0  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    80. fffff880`00c163e0  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    81. fffff880`00c163f0  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    82. fffff880`00c16400  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    83. fffff880`00c16410  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    84. fffff880`00c16420  78 b3 c1 00 80 f8 ff ff-5c b7 c1 00 80 f8 ff ff  x.......\.......
    85. fffff880`00c16430  d0 b8 c1 00 80 f8 ff ff-80 18 c2 00 80 f8 ff ff  ................
    86. fffff880`00c16440  a0 b7 c1 00 80 f8 ff ff-20 b7 c1 00 80 f8 ff ff  ........ .......
    87. fffff880`00c16450  80 18 c2 00 80 f8 ff ff-80 b5 c1 00 80 f8 ff ff  ................
    88. fffff880`00c16460  3c 18 c2 00 80 f8 ff ff-1c b6 c1 00 80 f8 ff ff  <...............
    89. fffff880`00c16470  3c 18 c2 00 80 f8 ff ff-3c 18 c2 00 80 f8 ff ff  <.......<.......
    90. fffff880`00c16480  c0 71 c0 00 80 f8 ff ff-3c 18 c2 00 80 f8 ff ff  .q......<.......
    91. fffff880`00c16490  3c 18 c2 00 80 f8 ff ff-3c 18 c2 00 80 f8 ff ff  <.......<.......
    92. fffff880`00c164a0  3c 18 c2 00 80 f8 ff ff-3c 18 c2 00 80 f8 ff ff  <.......<.......
    93. fffff880`00c164b0  3c 18 c2 00 80 f8 ff ff-48 bc c1 00 80 f8 ff ff  <.......H.......
    94. fffff880`00c164c0  4c b5 c1 00 80 f8 ff ff-3c 18 c2 00 80 f8 ff ff  L.......<.......
    95. fffff880`00c164d0  24 b4 c1 00 80 f8 ff ff-24 b8 c1 00 80 f8 ff ff  $.......$.......
    96. fffff880`00c164e0  3c 18 c2 00 80 f8 ff ff-00 00 00 00 00 00 00 00  <...............
    97. fffff880`00c164f0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    98. fffff880`00c16500  14 ab c1 00 80 f8 ff ff-8c b9 c1 00 80 f8 ff ff  ................
    99. fffff880`00c16510  68 b0 c1 00 80 f8 ff ff-8c b9 c1 00 80 f8 ff ff  h...............
    100. fffff880`00c16520  44 ae c1 00 80 f8 ff ff-8c b9 c1 00 80 f8 ff ff  D...............
    101. fffff880`00c16530  8c b9 c1 00 80 f8 ff ff-3c e9 c1 00 80 f8 ff ff  ........<.......
    102. fffff880`00c16540  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    103. fffff880`00c16550  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    104. fffff880`00c16560  78 b9 c1 00 80 f8 ff ff-b8 e9 c1 00 80 f8 ff ff  x...............
    105. fffff880`00c16570  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    106. fffff880`00c16580  78 b9 c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  x.......x.......
    107. fffff880`00c16590  78 b9 c1 00 80 f8 ff ff-90 ec c1 00 80 f8 ff ff  x...............
    108. fffff880`00c165a0  14 ae c1 00 80 f8 ff ff-78 b9 c1 00 80 f8 ff ff  ........x.......
    109. fffff880`00c165b0  f0 ab c1 00 80 f8 ff ff-d4 ae c1 00 80 f8 ff ff  ................
    110. fffff880`00c165c0  78 b9 c1 00 80 f8 ff ff-00 00 00 00 00 00 00 00  x...............
    111. fffff880`00c165d0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    112. fffff880`00c165e0  00 00 00 00 00 00 00 00-e8 65 c1 00 80 f8 ff ff  .........e......
    113. fffff880`00c165f0  e8 65 c1 00 80 f8 ff ff-00 00 00 00              .e..........
    114. 0: kd>
     
    GRAFik и Mikl___ нравится это.