在C ++中查找函数的地址

时间:2012-01-10 02:43:31

标签: c++ winapi assembly reverse-engineering

我想知道是否有人知道如何获取你所在的函数的地址。让我说我挂钩MessageBoxA()。当调用MessageBoxA()时,我称之为伪函数hookMes​​sageboxA()。从hookMes​​sageBoxA()中我想吐出从哪里调用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);

4 个答案:

答案 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()'函数。有关更多信息,请参阅平台文档。

其他平台可能有类似的例程。