当前位置: 技术问答>linux和unix
程序修改自己(内存中的代码)
来源: 互联网 发布时间:2016-07-29
本文导语: APUE的7.6节《C程序的存储空间布局》上说“正文段通常是只读的,以防止程序由于意外而修改其自身的指令”那么如何修改自己的指令呢? 还有,程序被装在到内存后,与原来在硬盘中的程序文件有什么关系,为什么...
APUE的7.6节《C程序的存储空间布局》上说“正文段通常是只读的,以防止程序由于意外而修改其自身的指令”那么如何修改自己的指令呢?
还有,程序被装在到内存后,与原来在硬盘中的程序文件有什么关系,为什么不能将其删除?
还有,程序被装在到内存后,与原来在硬盘中的程序文件有什么关系,为什么不能将其删除?
|
一定要修改的话,试试这个,不一定行得通:
#include
#include
int fun()
{
return 1234;
}
int main()
{
int a = fun();
printf("%dn", a);
mprotect( (void*)((unsigned long)fun & ~(4096-1)), 4096, PROT_READ|PROT_WRITE|PROT_EXEC ); //第一个古怪的参数是用来对齐页面边界的
char* p = (char*)fun;
//以下指令仅在 x86 或 x86-64 平台有效
*p++ = 0xb8; //mov eax, 256
*p++ = 0x00;
*p++ = 0x01;
*p++ = 0x00;
*p++ = 0x00;
*p++ = 0xc3; //ret
a = fun();
printf("%dn", a);
return 0;
}