eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Программирование —› Управление памятью без сервисов ОС
Посл.ответ Сообщение

Ранг: 37.5 (посетитель)
Статус: Участник

Создано: 6 июля 2019 12:39 New!
Цитата · Личное сообщение · #1

Я когда-то на старом васме поднимал этот вопрос - ничего лучше, чем заюзать DMA тогда не предложили. Но DMA тоже не решение.

Предлагаю рассмотреть следующий способ. Пусть наш код ринг-0 расположен в от n до n+x страницах адресного пространства. Физический адрес этих страниц мы, понятно, не знаем. Начнем в цикле менять IA32_APIC_BASE MSR, начиная с нуля, с шагом 4Кб. Напомню, что там хранится _физический_ адрес local APIC. При этом мы пытаемся записать и потом прочитать какое-то значение в страницу с адресом n+1 по любым зарезервированным local APIC адресам в пределах этой страницы. Если local APIC спроецирован на какую-то другую страницу, то чтение после записи вернет ожидаемое значение.
Если local APIC спроецирован именно на эту страницу, что чтение дворда по зарезервированному адресу вернет 0xFFFFFFFF (или 0 - уже не помню). Как только это произошло, то мы узнали физический адрес этой страницы (он равен IA32_APIC_BASE). После чего уже можно в ней строить PDE, записать этот адрес в CR3 и таким образом поиметь полный контроль над памятью. Понятно, что здесь немало нюансов - кроме PDE нужны еще PTE (я для простоты сейчас говорю о простой двухуровневой модели страничного преобразования со страницами 4Кб), но это все решается по аналогичной схеме. Единственное, что меня смущает - что произойдет, когда в цикле local APIC спроецируется на страницу, где расположен текущий выполняемый код? Как показали мои опыты с SMM, при проецировании local APIC на SMRAM процессор берет код SMM-хэндлера из SMRAM, а не из регистров APIC, хотя данные читает и пишет все-таки в APIC. Так что с этим вроде бы все в порядке. Есть еще нюанс с кэшированием. Проекция local APIC на кэшируемую память и обращение к ней приводит к machine check error. Поэтому надо дизаблить кэширование в MTRR, что приводит к необходимости синхронизировать все описанные операции с другими ядрами.


Ранг: 72.2 (постоянный)
Статус: Участник

Создано: 6 июля 2019 16:11 New!
Цитата · Личное сообщение · #2

spinz

Норм такой вопрос для какого нибудь osdev.ru

> Физический адрес этих страниц мы, понятно, не знаем.

Почему же не знаем, (CS << 4) + offset(Ip). Или в реалмоде какой то иной механизм адресной трансляции

Ранг: 37.5 (посетитель)
Статус: Участник

Создано: 6 июля 2019 17:01 New!
Цитата · Личное сообщение · #3

Речь идет про протектед моде


Ранг: 72.2 (постоянный)
Статус: Участник

Создано: 6 июля 2019 17:12 New!
Цитата · Личное сообщение · #4

Там тоже проблемы адрес вычислить нет, прямой доступ к таблицам трансляции имеется в км. Какой вопрос или задача я так и не понял, брутить физические адреса через апик.. это жесть.)

Ранг: 235.5 (наставник)
Статус: Участник

Создано: 6 июля 2019 17:45 New!
Цитата · Личное сообщение · #5

Не понятно нафиг это надо.
ОС есть? Спроси у неё какой физ.адрес.
На Win есть MmGetPhysicalAddress() в ядре.

Ранг: 37.5 (посетитель)
Статус: Участник

Создано: 7 июля 2019 01:37 New!
Цитата · Личное сообщение · #6

cppasm пишет:
Не понятно нафиг это надо.

Кто в курсе, те поймут

Добавлено спустя 3 минуты
Dr0p пишет:
Там тоже проблемы адрес вычислить нет, прямой доступ к таблицам трансляции имеется в км.

правда? а подумать в голову не приходит мысль?


Ранг: 72.2 (постоянный)
Статус: Участник

Создано: 7 июля 2019 10:44 New!
Цитата · Личное сообщение · #7

spinz

А что делать с физическими адресами, ну допустим мы их вычислили ?

Ранг: 37.5 (посетитель)
Статус: Участник

Создано: 7 июля 2019 11:06 New!
Цитата · Личное сообщение · #8

В cr3 новую табличку страниц


Ранг: 72.2 (постоянный)
Статус: Участник

Создано: 7 июля 2019 11:24 New!
Цитата · Личное сообщение · #9

Для чего новую ?

Чем текущая не устраивает, тем более что в новом АП данных не будет. Зачем выделять новую память таким извращённым способом ?

Ранг: 37.5 (посетитель)
Статус: Участник

Создано: 7 июля 2019 11:49 · Поправил: spinz New!
Цитата · Личное сообщение · #10

Похоже, что Инде не понимает сути страничной адресации. АП остается тем же, меняется отображение его на физпамять. Если, например, по каким-то причинам при прежней адресации ты не мог достучаться до какой-то физ.страницы (ее тупо нет в PTE), то сейчас ты сможешь рулить самостоятельно.

Добавлено спустя 4 минуты
Dr0p пишет:
Зачем выделять новую память таким извращённым способом ?

Авер теоретически может контролить вызов сервисов ОС. А тут он совсем мимо. И плюс - абсолютно независимо от ОС. Этот способ сработает хоть в лине, хоть в винде

Ранг: 235.5 (наставник)
Статус: Участник

Создано: 7 июля 2019 12:08 · Поправил: cppasm New!
Цитата · Личное сообщение · #11

spinz пишет:
Похоже, что Инде не понимает сути страничной адресации. АП остается тем же, меняется отображение его на физпамять.

И? А тот же код и данные которые были в старых физ.страницах в новых откуда возьмётся?
Кроме твоего кода ещё 100500 потоков работает, и всё упадёт как только ты отображение сменишь.
Чтобы это взлетело надо в новую таблицу страниц скопировать существующую, и потом её модифицировать.
Вот и вопрос нафига копировать, почему текущую не поменять?


Ранг: 72.2 (постоянный)
Статус: Участник

Создано: 7 июля 2019 12:13 New!
Цитата · Личное сообщение · #12

spinz

> АП остается тем же, меняется отображение его на физпамять.

Физ памятью рулит ОС, данные в памяти лишь частично и временно находятся, они перемещаются туда-сюда между свопом и рабочим набором. Какие физ страницы отображены на вирт адреса - это не имеет значения, этим занимается менеджер памяти ОС. Вся работа с ОС идёт через VA.

> какой-то физ.страницы (ее тупо нет в PTE), то сейчас ты сможешь рулить самостоятельно.

А откуда мне знать физические адреса^
Тоесть мне данные из диска достать самостоятельно, даже определив по PA для VA.. переписав пол ОС!?

> Этот способ сработает хоть в лине, хоть в винде

А в чём собственно способ" заключается ?
Что то связанное с формированием нового АП(cr3). Но для чего, как и что ?

Ранг: 37.5 (посетитель)
Статус: Участник

Создано: 7 июля 2019 17:06 New!
Цитата · Личное сообщение · #13

cppasm пишет:
А тот же код и данные которые были в старых физ.страницах в новых откуда возьмётся?

Ты *? от смены мапинга в физических страницах внезапно все пропадет? Иди маны читать, даже Инде в этом слегка шарит

Добавлено спустя 0 минут
Dr0p пишет:
этим занимается менеджер памяти ОС

ты бы хоть название треда прочел

Ранг: 235.5 (наставник)
Статус: Участник

Создано: 7 июля 2019 20:18 New!
Цитата · Личное сообщение · #14

spinz, курить надо меньше
Процесс оперирует виртуальными адресами.
Допустим код расположен в странице с VA VA_BASE которая замаплена на PA_BASE.
Ты взял и сменил отображение для VA_BASE на другую физ. страницу - и чё?
В старой физ. странице то код останется, только после смены отображения он никому нафиг не нужен.
А в новой физ. странице на которую ты отобразил VA_BASE его нету. Всё рухнет.
Так что маны иди сам кури, знаток.
А с таким подходом удачи, будешь долго ответы ждать...


Ранг: 286.3 (наставник)
Статус: Участник

Создано: 10 июля 2019 19:26 New!
Цитата · Личное сообщение · #15

cppasm

Не понятно ничего про идеи тс, но могу рассказать про свои подобные.

Лет 5 назад было несколько подобных идей, реализовано ничего небыло(кроме ядерного монитора - side"). Я помню начальную задачу - планировалось расшарить общую память ядра на процессы и таким образом каждый ав процесс читал бы не общую системную, а локальную память, соответственно не видя патч ядра.

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

Code:
  1. ; Выгрузка региона в своп.
  2. ;
  3. ; После проецирования(MmMapViewInSystemSpace()) секции(MEM_COMMIT) регион
  4. ; не присутствует в рабочем наборе. Он появляется после доступа к проекции.
  5. ; Возможно это не всегда так. Поэтому поступим иным способом.
  6. ;
  7. ; MmTrimAllSystemPag[e]ableMemory() выгружает только системную память.
  8. ;
  9. ; Запрос физического региона через MmAllocateContiguousMemorySpecifyCache()
  10. ; приводит к MmEmptyAllWorkingSets():
  11. ; Выделим регион подкачиваемой памяти, определим физический адрес его и
  12. ; вызовем MmAllocateContiguousMemorySpecifyCache() для полученного адреса.
  13. ; Подкачиваемый регион будет гарантированно выгружен. Но механизм медленный.


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

Я вообще последнее время воспринимаю подобных ядерщиков" как не вполне адекватных людей.
 eXeL@B —› Программирование —› Управление памятью без сервисов ОС

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS