защищенные от записи виртуальные страницы, поймать запись - PullRequest
0 голосов
/ 05 января 2009

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

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

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

1 Ответ

1 голос
/ 05 января 2009

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

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

std::signal(SIGSEGV, my_segv_handler_func);

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

  1. имеет отображение объектов на страницы так что вы можете определить, является ли запись на страницу - это запись на особо охраняемый объект или
  2. сверните свой собственный malloc, который всегда выделяет на 4k границы, что заставит вас использовать минимальный размер выделенного блока 4k

Я не знаю, на грани головы, есть ли лучший способ, но с ним интересно играть. :)

...