Работа с физической памятью

Тема в разделе "WASM.BEGINNERS", создана пользователем 2010kohtep, 22 дек 2017.

  1. 2010kohtep

    2010kohtep New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2017
    Сообщения:
    6
    Добрый день.

    Я разрабатываю программу для работы с физической памятью, которая по сути имеет прямой доступ к RAM через маппинг "\device\physicalmemory" и может читать и записывать в RAM. Программа выполняет функцию сканирования и находит строку, докладывая об этом, прикладывая адрес находки. Через несколько секунд я пытаюсь записать по этому адресу что-то, но запись завершается провалом. Если просмотреть этот адрес вручную, то там могут быть совсем другие данные, либо адрес внезапно ссылается на недоступную память.

    Вопрос достаточно тривиален - почему это происходит и как с этим бороться? Долгое время работал в пространстве виртуальных адресов, а не физических, поэтому подобные моменты объяснить не выходит. Неужели данные в оперативке перетасовываются время от времени и не остаются на месте? Конечно, в пространстве какого-нибудь процесса память тоже двигается, но в RAM это происходит намного интенсивнее, судя по всему.

    Плюс ко всему, не подскажете ли вы какую-нибудь литературу, в которой описана работа с девайсом physicalmemory? Детально изучить структуру самой оперативной памяти было бы весьма полезно.

    Заранее спасибо.
     
    Последнее редактирование: 22 дек 2017
  2. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Давно перекрыли \device\physicalmemory в крайней мере с юзермода
    если руткитствуете, юзайте ZwProtectVirtualMemory с локами :)
     
  3. Indy_

    Indy_ Well-Known Member

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

    Данные в памяти часто не присутствуют непрерывно, они выгружаются в файл, при этом физическая страница несколько раз изменяет своё состояние(перемещается между несколькими списками менеджера памяти, он её очищает и освобождает). Когда данные вновь нужны они подкачиваются в свободную физическую страницу, таким образом физический адрес данных изменяется, а данные в странице изменяются спонтанно. Если виртуальная страница закреплена в рабочем наборе(не выгружаема), то данные в физической странице изменяться не будут.
     
    LastNoob и Mikl___ нравится это.
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Indy_, ага про флюш - эт может быть, я про локи не зря свистнул ;)
     
  5. 2010kohtep

    2010kohtep New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2017
    Сообщения:
    6
    Да, ещё со времен windows 2003, если не ошибаюсь, но я обращаюсь к физ. памяти из юзермода не совсем легальным путём, хех. Так что доступ присутствует.

    Можно подробнее про этот момент, пожалуйста? Что за локи? Интернет не выдает ничего про это. Своеобразная фиксация адреса памяти в оперативке, что ли?

    То есть по сути в физической памяти тоже время от времени необходимы выделения (или освобождения) новых участков и в ней нет сразу полного доступа к любому участку любой страницы? По аналогии с виртуальной памятью?

    Тогда как можно закрепить (и в будущем, возможно, открепить) страницу, чтобы адреса после сканирования оставались хотя бы некоторое время постоянны? Да и безопасно ли это вообще?
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    > в ней нет сразу полного доступа к любому участку любой страницы?

    Нет конечно.

    > Тогда как можно закрепить (и в будущем, возможно, открепить) страницу, чтобы адреса после сканирования оставались хотя бы некоторое время постоянны?

    Это можно сделать из юм для юм адресов, упомянутая блокировка памяти например(NtLockVM).
     
  7. 2010kohtep

    2010kohtep New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2017
    Сообщения:
    6
    Интересует конкретно фиксирование физической памяти, а не виртуальной, так как найденный блок данных в физ. памяти может неожиданно съехать куда-то через некоторое время. Доступ к ядру присутствует, конечно же.
     
  8. Indy_

    Indy_ Well-Known Member

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

    Если есть доступ к км, то зачем тогда использовать физ память(искать строку через отображение) :preved:

    Строка вообще может не быть в памяти, а находится на диске, подгружена она будет только при непосредственном обращении к странице, а не при отображении памяти.
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    2010kohtep,
    Это не физическая память, от того что МС неправильно название сделало у вас сыр-бор в голове.
     
  10. 2010kohtep

    2010kohtep New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2017
    Сообщения:
    6
    Возможно это и не совсем до конца физическая память, как я её себе представляю, но функции, которые предоставляет этот девайс, вполне удовлетворяют всем требованиям. Осваивать это чудо я начал несколько дней назад, так про про многие тонкости ещё не в курсе, потому и прошу некоторой помощи у знающих. :yes4:

    Это ведь своп, отключив который можно, в теории, избежать перемещений фрагментов памяти на диск, но этого наверняка может не хватить, чтобы заставить оперативку прекратить тасовать данные. Вопрос как раз и заключается в том, как "отключить" эти перемещения, или хотя бы как под них адаптироваться.
     
  11. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Выделить невыгружаемый участок памяти. Все современные ОС поддерживают эту фичу. В linux это системные вызовы mlock() и mmap().
     
  12. Indy_

    Indy_ Well-Known Member

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

    Вы не ответили на мой вопрос. Какого чёрта нужно использовать железо, если ось многократно абстрактная.

    > Это ведь своп, отключив который можно, в теории

    Какой теории, если утверждаете что с этим не знакомы.

    Решение:

    Так как тс утверждает что есть доступ к блокированной технологии(physmem) и одновременно км привилегии, при этом утверждает что есть доступ к км и не ответил на вопрос, который важен и его раскрывает, то решение полагаю должно быть следующим.

    Адекватный ответ на адекватный и раскрывающий суть вопрос(#8).

    Если тс отказывается отвечать(он проигнорил), то автоматом делается вывод об не адекватности.

    Это значит что тс пришёл не для поиска решения и обсуждения.

    В таком случае решение одно - ожидаем ответ тс, если же его нет или ответ не адекватен, то досвидания.
     
  13. Indy_

    Indy_ Well-Known Member

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

    Ему не нужно выделять память, он ищет строку сканом всей физ памяти. Полный абсурд.
     
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    раздел NT - то линукс тут не причем

    Если нужна неподкачиваемая память то ExAllocatePool (NonPagedPool) - доступ к этому адресу будет всегда и ОС ничего не перетасовывает - это у вас каша в голове (не в обиду)

    Перед доступом к какому-либо адресу нужно делать ProbeForRead\ProbeForWrite.

    А вообще я поддерживаю Инди. - Че за странная задача.

    Ну и перенесу в Беггиннерс. Ибо
     
    Indy_ нравится это.
  15. Indy_

    Indy_ Well-Known Member

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

    Не уверен на счёт переноса темы. Впрочем это не важно.

    Как я говорил странно что с привилегиями км тс использует древний и дикий способ. Который нельзя даже в принципе реализовать. Система предоставляет средства для выгрузки памяти, но не для её подкачки. Для решения придётся использовать низкоуровневые фичи, вмешаться в логику работу мнп, к примеру использовать ось зависимые макро по типо pfn_lock. Это очень не хорошо.

    Могу привести пример задачи, которую решал. Была задача выделения произвольной физической страницы. Легального способа вроде бы как нет(я не нашёл). Поэтому был использован дикий способ - вся память системы выгружалась(MmTrimAll..), это освобождало физ память и после этого страница захватывалась. Но такие методы не есть гуд, а главное что бы понять как работает менеджер памяти нужны года, это самый сложный механизм ос.
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Indy_,
    Технически Ось позволяет получать физические адреса. Тут проблем нет

    MmAllocatePagesForMdlEx
    потом по MDL получить PFNs .
    потом мапим через MmMapIoSpace, потом MmAllocateContiguousMemory делаем (nonCached) и по VA с помощью MmGetPhysicalAddress получаем заветный физический адрес страницы уже замапленную в систему память.

    Но все равно к задаче тс врядли это имеет отношение.
     
  17. Indy_

    Indy_ Well-Known Member

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

    Повторю задачу.

    ТС сканит память через отображение физической памяти. Это значит что чтение асинхронно, тоесть содержимое памяти спонтанно. При этом тс утверждает что у него есть доступ к км. Что само по себе абсурдно и является противоречием.

    При полном скане памяти создавать копию региона через мдл врядле возможно. Я решение вижу такое. Так как системная память общая для всех процессов, то выполняем аттачь к процессам и сессиям, локально перебирая регионы используя высокоуровневые апи. Нет апи(я не знаю такой) чтобы закрепить всю пажед память, это нарушает архитектуру. Можно закрепить страницу, но никак не всю физ память. Кстате если глянуть ядро, то можно заметить забавную вещь - при включённом км верифере вся системная пейдж память выгружается непрерывно :)

    Можно поиграться" с выгрузкой и из юм. Есть сервис, который сбрасывает весь рабочий набор. И есть мониторы, которые возвращают инфу по вс.

    Меня больше интересует ответ тс, чем архитектура.
     
  18. 2010kohtep

    2010kohtep New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2017
    Сообщения:
    6
    Но ведь каждый ребенок знает, как работает своп: копирует данные из ОЗУ на какое-нибудь энергонезависимое устройство, какое конкретно - указывается в настройках системы. Я не знаю, как работает сама оперативная память в целом, как в ней выглядят процессы выделения/освобождения регионов и т.д.

    Ну, допустим, нужно найти в памяти нужную строку и отредактировать её. Строка эта, скорее всего, лежит даже не в процессах, а где-то в другом месте (допустим, нужно найти серийный номер HDD и изменить его). Или какие-нибудь другие данные, которые не лежат в запущенных процессах операционной системы. Да, понимаю, странные запросы, но не обессудьте - сам в теме по работе с физ. памятью недавно, поэтому такие вопросы странные получаются.

    Я бы не делал таких поспешных выводов по поводу адекватности человека, который просто не понял вопроса, или просто его не заметил. Слишком уж это необдуманно и вызывающе получается.

    Это же виртуальные адреса, нужны физические.

    В общем, как я понял, фиксировать физические данные памяти для их последующего сканирования и поиска в ней нужных паттернов (примерно такое решения я ожидал) невозможно, так как данные внутри страниц постоянно меняют своё местоположение. Запретить тасовку данных в памяти тоже нельзя, поэтому производить сканирование всей физ. памяти затруднительно, да и не совсем грамотно это. Да и плюс ко всему всё там асинхронно относительно сканера и самого ОЗУ. Вывод - адекватного решения для задачи в первом посте не существует, придётся искать другие, менее радикальные по мнению пользователей форума альтернативы.
     
  19. Indy_

    Indy_ Well-Known Member

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

    > фиксировать физические данные памяти для их последующего сканирования

    Даже система не работает напрямую с физ памятью. Она абстракция в виде базы данных фреймом(pfn database) и всякое обращение к физ памяти происходит через этот механизм трансляции. Есть механизм, который ищет сигнатуры в памяти на бут этапе, можите посмотреть в врк.

    > Строка эта, скорее всего, лежит даже не в процессах, а где-то в другом месте

    В каком месте ?
    Если память не отображена, то её не существует. Любая страница описана через таблицы трансляции.

    > Я бы не делал таких поспешных выводов по поводу адекватности человека, который просто не понял вопроса, или просто его не заметил. Слишком уж это необдуманно и вызывающе получается.

    Адекватный человек вначале изучает механизм, прежде чем его использовать. Не понимаю как можно начать кодить драйвер, не понимая архитектурную базовую трансляцию(paging) и тем более софтверную. Наверно я это не могу понять в принципе. Вызывающе" - любая критика такая.
     
  20. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Золотые слова!

    Я думаю, чел хочет сканировать именно физическую память, так как думает, что якобы кто-то может в обход ОС записать данные в контроллер памяти. ) Ну это же глупо. Даже если бы и кто-то мог - система об этом не знает, и затрет эту память как пить дать. Можно по-фантазировать - стоит патч, который меняет работу менеджера памяти, для определенных регионов физических адресов - но я такого еще не встречал - да и вычислить такое можно косвенно.