1

書き込みアクセスを許可するために、protect を使用して .text セグメントの値を変更しようとしています。

 int pageSize = sysconf(_SC_PAGE_SIZE);

 int *toModify = (int *)(foo+5);
 if (mprotect(toModify, pageSize, PROT_WRITE) < 0 ) {
      perror("mprotect failed with error:");
      return -1;
  }
  *toModify = 5;
  printf("Modify :%i",foo());

mprotect は機能しません。常にmprotect failed with error:: Invalid argumentエラーを返します。

foo は、関数の 5 バイト後に格納される int を返すメソッドです (これが foo+5 の理由です)。

4

3 に答える 3

5

からman mprotect:

   EINVAL addr is not a valid pointer, or not a multiple of PAGESIZE.

addrどうやら...の倍数である必要がある部分に注意を払っていませんPAGESIZE...マニュアルページの少なくとも1つのバージョンでは、その要件は特に明確にされていませんが、単に「メモリページに必要な保護を指定します(s) 区間 [addr,addr+len-1] の一部または全部を含む".

特定のアドレスを含むページのアドレスを見つけることは、あなたがすでに少しやっているので、特に難しいことではありませんpageSize = sysconf(_SC_PAGE_SIZE);:

static inline void *pageof(const void* p)
{ return (p & ~(pageSize - 1));
}

次に、mprotect呼び出しを say に変更しますmprotect(pageof(toModify), pageSize, ...)。ただし、指定している権限に関する警告については、@Zackによる回答を参照してください。そして、戻ってマニュアルページを読んで、mprotect()自分が何をしているのかを本当に理解していることを確認してください...

于 2013-12-04T17:37:07.867 に答える