защищенные от записи виртуальные страницы, поймать запись

StackOverflow https://stackoverflow.com/questions/411788

Вопрос

Существует ли способ перехватить запись на защищенную от записи страницу?

Я планирую создать самоподобную объектную систему, где вы копируете объект, чтобы создать его экземпляр. (потому что это звучит просто и компактно по сравнению с остальными) Очевидно, что объекты, созданные для этой цели, должны быть защищены от записи. Я видел способ пометить что-то защищенное от записи в заголовках программ в ELF. (RE, RWE, RW -flags)

Это вообще обеспечивает защиту от записи? Я помню, это должно поднять segfault, это правда? Как перехватить запись на защищенную от записи страницу. Это хороший способ реализовать то, что я хочу, и есть ли лучший способ?

Это было полезно?

Решение

Да, вы можете использовать mprotect .

Да, запись в защищенную память вызовет ошибку. Вы можете установить обработчик, например, в C ++:

std::signal(SIGSEGV, my_segv_handler_func);

Это правдоподобный способ сделать то, что вы хотите, хотя вам нужно было бы добавить много лишних управленческих усилий, чтобы это работало. Например, такого рода обнаружение записи выполняется аппаратно, а на архитектурах x86 размер страницы составляет 4 КБ. Таким образом, вы можете защищать объекты по 4 Кб за раз, выровненные по границам 4 Кб, а не по обычному " начинать с адреса X и идти до N байтов " ;. Я полагаю, что вам придется либо

<Ол>
  • имеет отображение объектов на страницы так что вы можете определить, является ли запись на страницу - это запись на конкретный охраняемый объект или
  • сверните свой собственный malloc, который всегда         выделяет на 4k границы, что заставит вас использовать         минимальный размер выделенного блока 4 КБ
  • Я не знаю, изо всех сил, есть ли лучший способ, но это звучит забавно играть. :)

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top