0

親のページを子のページから保護する必要があります

  • mmap で MAP_ANONYMOUS フラグと fd = -1 を指定して shm_open を使用しないようにしました。
  • 基になるメモリを fchmod で保護しようとしました。

現在、次のセットアップを利用しています。

shm_unlink("/mymem");
int fd = shm_open("/mymem", O_RDWR | O_CREAT,0777);

printf("FD is :%d\n", fd);
ftruncate(fd, numberPages*getpagesize());

int *z = mmap(NULL, getpagesize()*numberPages, PROT_WRITE|PROT_READ, MAP_SHARED,fd,0);
printf("Memory is at : %p\n", z);

if(fork()){
   printf("Protecting %d\n",mprotect(z, getpagesize(), PROT_NONE));
   printf("(1)No issues, apparently\n");

   sleep(2);
   exit(1);
 }else{
   sleep(1);
   *z = 3;
   printf("(2)No issues, apparently\n");
   sleep(5);
   printf("Value of z: %d\n",*z);
 }

親プロセスがページを読み書きできないように、子プロセスがページを保護できるようにする必要があります (mprotect などを使用)。

受信した出力は次のとおりです。

FD is :3
Memory is at : 0xf581a000
Protecting 0
(1)No issues, apparently
(2)No issues, apparently
Value of z: 3

行 *z = 3 でセグメンテーション違反が発生することを期待している (というか、望んでいる) 場合。

残念ながら、子は TCP サーバーとしても機能し、ページをブロックする要求は TCP 接続を介して受信されるため、この機能が必要です (私が考えていない別の方法がない限り?)。

何かアドバイス?

4

1 に答える 1

2

mrotect()もちろん、子プロセスでは、親プロセスではなく、子プロセス自体のページのアクセス許可を変更しています。それは文書化されているとおりです:

mprotect() は、呼び出しプロセスのメモリ ページの保護を変更します。

(強調追加)

あなたの質問は、別のプロセス (呼び出しプロセスではない) のメモリ マッピングのアクセス許可を変更する方法に要約されます。ターゲット プロセス (メモリ マッピングが変更されるプロセス) の参加がなければ、これを行う移植可能な方法はないと思います。私が考えることができる唯一の方法は、ターゲットプロセスにデバッガーとしてアタッチすることです ( ptrace()Linux の例を参照)。それは複雑な解決策です。親プロセスに (たとえば、パイプを介して) メッセージを送信して、mprotect()それ自体で実行するように依頼することを検討しましたか?

于 2012-04-13T19:21:49.423 に答える