Мне интересно, есть ли способ защитить от записи каждую страницу в Linux
адресное пространство процесса (изнутри самого процесса, посредством
mprotect()
). Под «каждой страницей» я имею в виду каждую страницу
адресное пространство процесса, которое может быть записано обычным
программа работает в пользовательском режиме - так, текст программы, константы,
глобалы и куча - но я был бы счастлив только с константами,
глобалы и куча. Я не хочу защищать от записи стек - это
кажется плохой идеей.
Одна проблема в том, что я не знаю, с чего начать защиту от записи
объем памяти. Глядя на /proc/pid/maps
, который показывает разделы памяти
в использовании для данного PID, они всегда, кажется, начинаются с адреса
0x08048000
, с текстом программы. (В Linux, насколько я могу судить,
память процесса выложена с текстом программы на
снизу, затем константы выше этого, затем глобалы, затем куча, затем
пустое пространство разного размера в зависимости от размера кучи или
стек, а затем стек, растущий вниз от верхней части памяти в
виртуальный адрес 0xffffffff
.) Есть способ узнать, где находится верх
куча (вызывая sbrk(0)
, которая просто возвращает указатель на
текущий «перерыв», т. е. вершина кучи), но на самом деле не способ
скажи, где начинается куча.
Если я попытаюсь защитить все страницы от 0x08048000
до перерыва, я
в итоге получаю ошибку mprotect: Cannot allocate memory
. Я не знаю, почему mprotect
будет
в любом случае выделять память - и Google не очень помогает. Есть идеи?
Кстати, причина, по которой я хочу это сделать, заключается в том, что я хочу создать
список всех страниц, которые записываются во время выполнения программы, и
способ, которым я могу придумать, это защитить все страницы от записи,
пусть любая попытка записи вызовет ошибку записи, затем осуществите запись
обработчик ошибок, который добавит страницу в список, а затем удалит запись
защита. Я думаю, что я знаю, как реализовать обработчик, если бы я только мог
выяснить, какие страницы защищать и как это сделать.
Спасибо!