Microsoft Detours如何工作以及如何使用它来获取堆栈跟踪?

时间:2010-12-22 09:00:12

标签: windows detours

我是微软Detours的新手。我已经安装它来跟踪进程所做的系统调用。我运行以下来自网络的命令

syelogd.exe /q C:\Users\xxx\Desktop\log.txt 
withdll.exe /d:traceapi.dll C:\Program Files\Google\Google Talk\googletalk.exe

我得到了日志文件。问题是我不完全理解这里发生了什么。弯路如何运作?它如何跟踪系统调用? 另外我不知道如何读取log.txt中的输出。这是log.txt中的一行

20101221060413329 2912 50.60: traceapi: 001 GetCurrentThreadId()

最后,我想获得该过程的堆栈跟踪。我怎么能得到它?

4 个答案:

答案 0 :(得分:25)

Detours让你拦截任何功能。它在您指定的地址中放置一个jmp,为您的代码创建一个蹦床。最后,如果要执行此操作,请调用旧函数。 要使用Detours,您必须在要拦截的过程中注入代码。

为简化此过程,您可以使用Deviare API Hook执行所有注入人员,并且可以使用任何支持COM技术的编程语言(包括.NET,Delphi,C ++,Python等)的拦截应用程序。 下载软件包后,您会在其中找到一些示例。有一个名为DeviareCSharpConsole的控制台,可以拦截显示完整堆栈跟踪信息的任何进程的任何API。

这是Deviare API Hook的工作方式,但如果您想创建一个挂钩另一个进程的应用程序,则需要执行此操作:

Deviare API Hook Design

应在目标进程中创建代理以拦截所需的API。要拦截这些API,您可以使用Detours,但您必须编写未包含在该库中的IPC人员。

如果您需要使用Deviare API Hook在目标流程中编写代码,则可以使用Deviare Custom Hooks。此功能允许您拦截API并异步处理已处理的参数。

答案 1 :(得分:22)

您可能需要查看mhook 2.4,而不是绕路(仅限32位免费)或easyhook(即khm,位杂乱的代码)非常简洁的代码和BSD许可。适用于x86和x64,处理IP相关代码等。

还有关于它如何在网站上运作的详尽描述。

alt text

对于堆栈回溯,您可以使用kernel32中的CaptureStackBackTrace(),或者如果您想获得幻想,请使用dbghelp中的StackWalk64()

答案 2 :(得分:16)

首先,我强烈建议,如果你想执行API挂钩,我会选择easyhook:http://easyhook.codeplex.com/(开源)。 这是一个非常好的,简单的api-hook框架。

关于如何获取堆栈跟踪,我不记得到底是怎么做的,但请查看WinAPIOverride32:http://jacquelin.potier.free.fr/winapioverride32/(开源)。 他正是这样做的,而且它是开源的。 此外,如果您需要研究跟踪,WinAPIOverride32是一个很好的应用程序,用于研究应用程序的工作方式。

编辑:只需再添加一个应用程序。 http://www.rohitab.com/就像WinAPIOVerride32,但它支持64位,自从我写这个答案后它真的有所改进。我必须指出它在某些情况下它错过了我在WinAPIOverride32中找到的API调用,但它仍然相当不错。不幸的是,消息来源尚未公布。

关于api-hook如何工作, 嗯,这是一个很长的解释,我会指向你这篇文章: http://www.codeproject.com/KB/system/hooksys.aspx 它给出了一个非常好的解释,说明它是如何在幕后完成的(除了那里写的还有其他方法,但它仍然是一篇非常好的文章)。

希望它有所帮助! : - )

答案 3 :(得分:3)

如果允许您使用Detours以外的其他内容you could install a debugger like WinDbg and attach it to the process来获取callstack。

您还可以尝试其他工具,例如 Process Monitor Windows Performance Toolkit ,如here所述。