2012-01-10 77 views
1

我想知道是否有人知道如何獲取您所在函數的地址。讓我們說我掛鉤了MessageBoxA()。當MessageBoxA()被調用時,我稱之爲僞函數hookMes​​sageboxA()。從hookMes​​sageBoxA()中我想吐出MessageBoxA()從哪裏調用。那有意義嗎?可能需要使用組件,但我不確定如何完成。在C++中查找函數的地址

下面的代碼是錯誤的,它只是我認爲可能要做的事情。任何關於如何在彙編和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); 

回答

3

您感興趣的功能(鑑於您使用的是Windows),爲StackWalk64。我建議你閱讀一些提示下面的文章上使用此功能:

Walking the Callstack

解剖的代碼應該給你,你到底是什麼後,儘管在一個操作系統相關的方式 - 唯一辦法。文章應該證明很方便,但它不是最友好的功能:)。

+0

謝謝。我希望我不必爲此學到更多:D。 – user954753 2012-01-10 02:58:01

+0

@ user954753沒問題,希望文章能爲你節省很多小時的傷心:)。 – 2012-01-10 03:01:37

0

如果你知道你在函數的名稱,函數的名稱是指針指向它,但我相信你已經知道,鑑於你目前的指針兩輪牛車。

否則,你將不得不走路當前的堆棧。看看StackWalk64和相關函數,或DIA SDK(顯然,我從來沒有看過它)。當然,這是MS特定的。其他平臺有其他方法(如我剛剛忘記用戶名稱的其他人)。否則,您可以手動操作堆棧(如果您知道ABI並可以訪問平臺的堆棧指針)。

+0

感謝您的迅速響應。 :) – user954753 2012-01-10 03:08:05

0

在標準C++中不可能......但是有可能瞭解特定編譯器如何編譯和運行代碼以及診斷鉤子。例如,在Mac OS X中,您可以使用'backtrace()'或'backtrace_symbols()'函數。請查閱您的平臺文檔以獲取更多信息

其他平臺可能有類似的例程。

+0

感謝您的信息。我會仔細看看的。 – user954753 2012-01-10 03:08:22

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()); 
} 
+0

謝謝。我結束了,只是勾起我的鉤子並追溯。該應用程序正在隱藏序號。我將在下次使用這個。 – user954753 2012-01-11 00:06:27