1

私は自己変更プログラムを書いています。すでに機能しています。これらの 2 つの関数を見つけましたが、正確に何をするかわからないので、コードに適切なコメントを付けたいと思います。

ページサイズは getpagesize を使用して取得されます

/*
 * Defining variables:
 * func - function in memory I'm using mprotect on
 * offset - the offset in memory
 * ptr - the pointer to the memory
 */

unsigned int offset = (unsigned int)( ((long)func) & (pagesize-1) );
unsigned char * ptr = (unsigned char *) ((long)func & (~(pagesize-1) ) );

オフセットの関数がメモリ アラインメント チェックに使用されていることがわかりました。私は彼らが何をしているのか漠然と知っていますが、違いはありませんか?

ありがとう。

4

2 に答える 2

4

をページpagesizeのサイズとすると、ビット マスクを使用してptr、 を含むページの先頭へのポインター ( ) と、そのページ内funcのオフセット ( ) をバイト単位で計算します。offset

pagesize常に 2 の累乗になるように、すべて(pagesize-1)1 を設定します。ページ内のオフセットは最後の 12 (たとえば) ビット (12 はページサイズが 4k=2^12 に対応) であるため、最初のステートメントは、最下位 12&のすべて 1 のビットマスクを使用して、最後の 12 を除くすべてのビットをクリアします。ビット。

2 行目では、最後の 4 ビットをクリアすることにより、ページ自体へのポインターを計算します。~前のビットマスクの論理反転 ( )、次に を使用して&、他のすべてのビットをクリアします。

于 2014-01-22T18:14:57.523 に答える
0

(「pagesize」はプラットフォームのページ サイズであり、2 の累乗であると仮定します。たとえば、x86 では 0x1000 です。また、「func」は関数へのポインタ、つまり必要なコードであると仮定します。変化する)。

「offset」にはコードのページのオフセットが含まれ、「pthr」にはコードを含むメモリ ページがマップされる仮想アドレスが含まれます。私の推測では、プログラムのどこかに、コードのページの新しい仮想ビュー (さまざまなアクセス権、特に書き込み権限を持つ) が作成されていると思います。この新しいアドレスが「unsigned char *page2」に格納されているとしましょう。そのため、コードは *(page2 + offset) に書き込むことで変更できます。

于 2014-01-22T18:19:15.637 に答える