- 注册时间
- 2004-8-29
- 最后登录
- 1970-1-1
|
发表于 2006-10-7 11:08:20
|
显示全部楼层
赫赫,还是用事实来说明吧:
long FileRetAdd;
int RamRetAdd;
int LastRam;
//相关函数*******************************
void SetReturn(long temp){
//记录返回main函数的信息
FileRetAdd = 0;
memcpy(&FileRetAdd, temp - 5, 3);
memcpy(&RamRetAdd, temp - 2, 2);
LastRam = temp - 5;
}
void changeram(){
int temp;
//修改ReturnToMain的内存信息
temp = LastRam;
memcpy(&temp - 2, &temp, 2);
}
void ForceReturn(){
long temp;
//修改函数的返回信息
memcpy(&temp - 5, &FileRetAdd, 3);
memcpy(&temp - 2, &RamRetAdd, 2);
memcpy(LastRam, &temp - 5,5);
changeram();
}
//***************************************
void function1(){
ForceReturn();//越级返回,如果去掉此行则以正常的方式返回
}
void function2(){
function1();
printf("return from function1!\n");
}
void function3(){
function2();
printf("return from function2!\n");
}
int function4(){
char var;
SetReturn(&var);//设定强制返回的地址为function4返回的地址.
function3();
printf("return from function3!\n");
return 1;
}
int retadd(){//返回此函数的开始地址
char add;
return &add - 5;
}
void main()
{
long temp;
int x;
SetScreen(1);
temp = retadd();//存放现在的main函数的内存信息
x =function4();
printf("return from function4!\n");
if(temp == retadd())//检测返回后的main的内存是否正常
printf("main's ram is not changed!");
getchar();
}
编译运行一下就知道鸟 |
|