#include <sys/mman.h> int mprotect(const void *addr, size_t len, int prot);
prot состоит из следующих побитно и логически сложенных значений:
Новые установки защиты заменяют предыдущие. Например, если память была ранее помечена PROT_READ, а mprotect вызывается с помощью параметра prot, равного PROT_WRITE, то данные, находящиеся в памяти, невозможно будет считывать.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>
#include <limits.h> /* для получения PAGESIZE */
#ifndef PAGESIZE
#define PAGESIZE 4096
#endif
int
main(void)
{
char *p;
char c;
/* Создать буфер; по умолчанию доступ к нему
устанавливается в PROT_READ|PROT_WRITE. */
p = malloc(1024+PAGESIZE-1);
if (!p) {
perror("Невозможно выделить память malloc(1024)");
exit(errno);
}
/* Выровнять пропорционально PAGESIZE; предполагается, что число должно быть кратно степени 2 */
p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));
c = p[666]; /* Чтение; ok */
p[666] = 42; /* Запись; ok */
/* Пометить буфер доступным только для чтения. */
if (mprotect(p, 1024, PROT_READ)) {
perror("Невозможно выполнить mprotect");
exit(errno);
}
c = p[666]; /* Чтение; ok */
p[666] = 42; /* Запись; программа прекращает работу при получении сигнала SIGSEGV */
exit(0);
}
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |