【问题标题】:Finding a function's address in C++在 C++ 中查找函数的地址
【发布时间】:2012-02-06 13:11:57
【问题描述】:

我想知道是否有人知道如何获取您所在函数的地址。假设我挂钩 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);

【问题讨论】:

    标签: c++ winapi assembly reverse-engineering


    【解决方案1】:

    如果你知道你所在的函数的名字,这个函数的名字就是指向它的指针,但我假设你已经知道给定你当前的指针hackery。

    否则,您将不得不遍历当前堆栈。看看StackWalk64 和相关函数,或者 DIA SDK(显然,我从来没有看过它)。当然,这是特定于 MS 的。其他平台有其他方法(正如我刚刚忘记用户名的其他人所说)。否则,您可以手动遍历堆栈(如果您知道 ABI 并且可以访问您平台的堆栈指针)。

    【讨论】:

    • 感谢您的快速回复。 :)
    【解决方案2】:

    在标准 C++ 中不可能...但是在了解特定编译器如何编译和运行代码以及使用诊断挂钩的情况下是可能的。例如,在 Mac OS X 中,您可以使用“backtrace()”或“backtrace_symbols()”函数。有关更多信息,请参阅您的平台文档。

    其他平台可能有类似的套路。

    【讨论】:

      【解决方案3】:

      您感兴趣的功能(假设您使用的是 Windows)是StackWalk64。我建议阅读以下文章,了解有关使用此功能的一些提示:

      Walking the Callstack

      剖析代码应该可以准确地为您提供所需的内容,尽管是以操作系统相关的方式 - 这是唯一的方式。这篇文章应该很方便,但它并不是看起来最友好的函数:)。

      【讨论】:

      • 谢谢。我希望我不必为此了解更多信息:D。
      • @user954753 没问题,希望这篇文章可以为您节省很多时间:)。
      【解决方案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());
      }
      

      【讨论】:

      • 谢谢。我最终只是用我的钩子和追溯。该应用程序隐藏了序数。不过我下次会用这个。
      猜你喜欢
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 2015-04-18
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多