7

ヒープメモリのチャンクを読み取り専用にしたい。そのために私は試してみましたがmemalign()mprotect()memalignmentから何を取得できるか、memalignはプロセスヒープからメモリを割り当てます。

ヒープの一部を読み取り専用にしたい。それについて何か助けはありますか?

malloc()->mmap()->mprotect()架空の考えですが、それが役立つかどうかはわかりません...上記で実装するサンプルコードはありますか?

ヒープ内のメモリアドレスを保護する必要があります。malloc()を使用すると、アドレスは0x10012008前後になりますが、mmap()を使用すると、0xf7ec9000になります。私の意図は、ヒープメモリの一部を読み取り専用にして、そのヒープを通過しようとする可能性のあるトランプラーをキャッチすることです。

4

2 に答える 2

4

はい、mmapとmprotectは正しい機能です。現在のアプローチの何が問題なのか、つまり「memalign()とmprotect()を試してみました。しかし、memalignmentから何を取得できるのか、memalignはプロセスヒープからメモリを割り当てます。 。」

以下は、書き込み保護されたメモリ領域を作成する方法の例です。

#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 done\n");
 munmap (memory, alloc_size);
 return 0;
}
于 2012-06-21T17:06:45.717 に答える
2

直接使用して完全mmap()にドロップする必要があります。malloc()また、ニーズによっては、まったく必要ない場合もありますmprotect()

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

最近のカーネルとlibcの実装では、これにより、指定された保護モードで要求された量のメモリが割り当てられます。この場合、割り当てられたメモリ領域は読み取りのみが可能で、書き込みはできません。ゼロページの束だけが必要な場合は、それで十分です。そうしないと、結果の領域が適切に位置合わせさmprotect()れ、制御された方法で短期間保護を解除するために使用できます...

于 2012-06-21T17:16:17.533 に答える