2012-06-25 61 views
1

我想知道如何记录函数的堆栈返回地址?如何在C++中记录函数的堆栈返回地址

如果您登录这样的参数:

int (WINAPI *pSend)(SOCKET s, const char* buf, int len, int flags) = send; 
int WINAPI MySend(SOCKET s, const char* buf, int len, int flags); 

//下面的DllMain

int WINAPI MySend(SOCKET s, const char* buf, int len, int flags) 
{ 
    fopen_s(&pSendLogFile, "C:\\SendLog.txt", "a+"); 
    fprintf(pSendLogFile, "%s\n", buf); 
    fclose(pSendLogFile); 
    return pSend(s, buf, len, flags); 
} 

那么我将如何日志发送的返回地址?

+0

“返回地址”是指保存的EIP? – jweyrich

+0

你想截获像Socks.dll或你自己的发送函数的win32 dll的Send函数吗? –

回答

1

您不能以独立于平台/编译器的方式执行此操作。在Windows中,您可以使用StackWalk/StackWalk64函数。我几年前就用过它们。如果您有堆栈中模块的调试信息,则可以获取函数的名称。

例如看看这个:http://msdn.microsoft.com/en-us/library/windows/desktop/ms680650(v=vs.85).aspx

+0

你能举个例子吗?或者将我指向一个教程? –

+0

如果这是在我正在钩的过程中呢?我没有调试信息。 –

+0

您需要调试信息。根据我的经验,即使使用调试信息(.pdb文件),只有90%的情况下,您将获得合理的结果。没有这个信息,费率就下降到30%。这仍然比没有好。 –

3

我不知道你想实现什么,所以很难知道这是正确的答案。我会假设你知道你在做什么,但我会敦促你重新考虑你的设计。

随着中说,检查出的内在_ReturnAddress()http://msdn.microsoft.com/en-us/library/64ez38eh,这将给你会立刻从返回调用_ReturnAddress()功能后执行的指令,这将给你的地址所在地址,并_AddressOfReturnAddress()http://msdn.microsoft.com/en-us/library/s975zw7返回地址被存储。

务必阅读文档仔细了解你正在找回的地址表示。如果你操纵回报地址,那么很可能会(并且将会)如果你做错了事情就会变得繁荣,那么请谨慎行事非常小心