защищенные от записи виртуальные страницы, поймать запись
-
03-07-2019 - |
Вопрос
Существует ли способ перехватить запись на защищенную от записи страницу?
Я планирую создать самоподобную объектную систему, где вы копируете объект, чтобы создать его экземпляр. (потому что это звучит просто и компактно по сравнению с остальными) Очевидно, что объекты, созданные для этой цели, должны быть защищены от записи. Я видел способ пометить что-то защищенное от записи в заголовках программ в ELF. (RE, RWE, RW -flags)
Это вообще обеспечивает защиту от записи? Я помню, это должно поднять segfault, это правда? Как перехватить запись на защищенную от записи страницу. Это хороший способ реализовать то, что я хочу, и есть ли лучший способ?
Решение
Да, вы можете использовать mprotect .
Да, запись в защищенную память вызовет ошибку. Вы можете установить обработчик, например, в C ++:
std::signal(SIGSEGV, my_segv_handler_func);
Это правдоподобный способ сделать то, что вы хотите, хотя вам нужно было бы добавить много лишних управленческих усилий, чтобы это работало. Например, такого рода обнаружение записи выполняется аппаратно, а на архитектурах x86 размер страницы составляет 4 КБ. Таким образом, вы можете защищать объекты по 4 Кб за раз, выровненные по границам 4 Кб, а не по обычному " начинать с адреса X и идти до N байтов " ;. Я полагаю, что вам придется либо
<Ол>Я не знаю, изо всех сил, есть ли лучший способ, но это звучит забавно играть. :) Р>