发布网友 发布时间:2022-04-22 05:53
共2个回答
热心网友 时间:2022-07-19 05:11
函数的返回地址
函数调用时通过一个指向函数的指针指向函数的地址,函数返回时将回归到调用处,那个地方是返回地址。
获取返回地址
在某些情况下,我们需要在一个函数里获取这个函数的返回地址,用来定位一些东西。在x86的C/C++里,一般函数调用形式不是__cdecl就是__stdcall,都是从右向左压参数的,所以最左边参数地址-4就是函数返回地址的存放地址。__thiscall也是一样,只是把this指针放到了ecx里。获取代码如下:
int func (int arg1, ......)
{ size_t* ret_addr = (size_t*)(&arg1);
printf(\"ret_addr = %08X\", *(ret_addr - 1));
}
有一个特殊情况,那就是COM的纯虚函数调用。因为把this指针也压到栈里了,在形参上又不可见,所以返回地址应该变为*(ret_addr -2)。
热心网友 时间:2022-07-19 06:29
一般是紧邻函数调用语句的下一条语句的地址, 因为函数调用结束后程序要继续执行, 所以先把这个地址压入堆栈, 等函数调用结束以后, 把这个地址从堆栈里面弹出来, 接着执行...