我想知道是否有人知道如何获取你所在的函数的地址。让我说我挂钩MessageBoxA()。当调用MessageBoxA()时,我称之为伪函数hookMessageboxA()。从hookMessageBoxA()中我想吐出从哪里调用MessageBoxA()。那有意义吗?可能需要使用汇编,但我不确定如何完成。
下面的代码是错误的,它只是我认为可能必须要做的事情。任何有关如何在汇编和C ++中执行此操作的帮助非常感谢!!!!!
DWORD address = 0x00;
_asm {
mov address, ebp
}
DWORD keyPointerAddr = (DWORD)hInstance + 0x1000 - address + 0x00401000;
char str[255];
sprintf(str,"That call is coming from [%d]\n", keyPointerAddr);
答案 0 :(得分:4)
您实际上不需要使用任何API。 MSVC提供an intrinsic来获取返回地址:
#include <stdio.h>
#include <intrin.h>
#pragma intrinsic(_ReturnAddress)
__declspec(noinline)
void noinline_func(void)
{
printf("Return address from %s: %p\n", __FUNCTION__, _ReturnAddress());
}
答案 1 :(得分:3)
您感兴趣的功能(假设您使用的是Windows),StackWalk64。我建议阅读以下文章,以获得有关使用此功能的一些提示:
<强> Walking the Callstack 强>
解析代码应该能够准确地为您提供所需的内容,尽管是以操作系统相关的方式 - 这是唯一的方法。这篇文章应该证明是有用的,它不是最友好的功能:)。
答案 2 :(得分:0)
如果你知道你所在函数的名称,那么函数的名称就是指向它的指针,但我认为你已经知道给定当前的指针hackery。
否则,你将不得不走完当前的堆栈。看看StackWalk64
及相关功能,或DIA SDK(显然,我从未看过它)。当然,这是MS特定的。其他平台有其他方法(因为另一个人我忘记了用户名已经说过)。否则,您可以手动遍历堆栈(如果您知道ABI并且可以访问平台的堆栈指针)。
答案 3 :(得分:0)
在标准C ++中不可能......但是可以了解特定编译器如何编译和运行代码以及使用诊断钩子。例如,在Mac OS X中,您可以使用'backtrace()'或'backtrace_symbols()'函数。有关更多信息,请参阅平台文档。
其他平台可能有类似的例程。