1

我正在编写一个自修改程序;已经开始工作了。我找到了这两个函数,但不确定它们到底做了什么,我喜欢正确地评论我的代码。

pagesize 是使用 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) ) );

我发现 offset 的函数被用于内存对齐检查。我隐约知道他们在做什么,但不知道有什么区别?

谢谢。

4

2 回答 2

4

假设pagesize是一个页面的大小,它们使用位掩码来计算指向ptr包含 的页面开头的指针 ( ),func以及该页面内的偏移量 ( offset)(以字节为单位)。

永远pagesize是二的幂,(pagesize-1)所有的都设置好了。页内的偏移量是最后 12 位(例如)(12 对应于 pagesize 为 4k=2^12),因此第一条语句通过使用&12 最低有效位的全为位掩码清除除最后 12 位之外的所有位位。

第二行通过清除最后 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 回答