如何在 Linux 中保护堆内存

how can I protect a heap memory in linux?

本文关键字:保护 内存 Linux      更新时间:2023-10-16

我想让一堆内存成为只读的。为此,我尝试了memalign()mprotect().但是从内存中我能得到什么,内存从进程堆中分配内存。

我想使堆的某些部分只读。对此有任何帮助吗?

malloc()->mmap()->mprotect()一个假设的想法,但不确定这是否有帮助......上面要实现的任何示例代码?

我需要保护堆内的内存地址。 使用 malloc() 我得到的地址大约是 0x10012008 而使用 mmap() 它是0xf7ec9000。我的目的是让堆的一部分被阅读,只是为了抓住任何可能试图穿过该堆的践踏者。

是的,mmap 和 mprotect 是正确的函数。我不明白您当前的应用程序有什么问题,即您所说的"为此,我已经尝试使用 memalign() 和 mprotect()。但是从内存中我能得到什么,内存从进程堆中分配出来。

下面是如何创建写保护内存区域的示例:

#include <fcntl.h>  
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
static int alloc_size;
static char* memory;
void segv_handler (int signal_number)  {
 printf ("memory accessed!n");
 mprotect (memory, alloc_size, PROT_READ | PROT_WRITE);
} 
int main () {
 int fd;
 struct sigaction sa;
 /* Install segv_handler as the handler for SIGSEGV. */
 memset (&sa, 0, sizeof (sa));
  sa.sa_handler = &segv_handler;
 sigaction (SIGSEGV, &sa, NULL);
 /* Allocate one page of memory by mapping /dev/zero. Map the memory
 as write-only, initially. */
  alloc_size = getpagesize ();
 fd = open ("/dev/zero", O_RDONLY);
  memory = mmap (NULL, alloc_size, PROT_WRITE, MAP_PRIVATE, fd, 0);
  close (fd);
  /* Write to the page to obtain a private copy. */
  memory[0] = 0;
 /* Make the memory unwritable. */
  mprotect (memory, alloc_size, PROT_NONE);
 /* Write to the allocated memory region. */
 memory[0] = 1;
  /* All done; unmap the memory. */
 printf ("all donen");
 munmap (memory, alloc_size);
 return 0;
}

您应该直接使用mmap()并完全删除malloc()。而且,根据您的需要,您可能根本不需要mprotect()

ptr = mmap(NULL, length, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);

在最近的内核和libc实现中,这将使用指定的保护模式分配请求的内存量 - 在这种情况下,分配的内存区域只能读取,而不能写入。如果你只需要一堆零页,那就行了。否则,生成的区域将正确对齐,您可以使用mprotect()以受控方式在短时间内取消保护它......