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

Posted

技术标签:

【中文标题】Microsoft Detours 如何工作以及如何使用它来获取堆栈跟踪?【英文标题】:How does Microsoft Detours work and how do I use it to get a stack trace? 【发布时间】:2010-12-22 09:00:11 【问题描述】:

我是 Microsoft 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()

最后我想得到进程的堆栈跟踪。我怎样才能得到它?

【问题讨论】:

【参考方案1】:

Detours 可让您拦截任何函数。它会在您指定的地址中放置一个 jmp,从而为您的代码创建一个蹦床。最后,如果你想这样做,你可以调用旧函数。 要使用 Detours,您必须在要拦截的进程中注入代码。

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

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

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

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

【讨论】:

【参考方案2】:

而不是 detours(仅对 32 位免费)或 easyhook(即 khm,一个 位混乱的代码),您可能想查看mhook 2.4,它非常简洁代码和 BSD 许可。适用于 x86 和 x64,处理 IP 相关代码等。

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

至于堆栈回溯,可以使用kernel32中的CaptureStackBackTrace(),或者如果你想花哨,使用dbghelp中的StackWalk64()。

【讨论】:

更新:Microsoft Detours 现在免费并且获得 MIT 许可,包括 x64 支持。见:github.com/Microsoft/Detours/blob/master/LICENSE.mdgithub.com/microsoft/Detours/wiki/OverviewHelpers【参考方案3】:

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

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

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

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

希望对您有所帮助! :-)

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于Microsoft Detours 如何工作以及如何使用它来获取堆栈跟踪?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Microsoft Detours 时访问冲突

使用 Microsoft Detours - 一堆未定义的

Microsoft Detours 2.1简介

构建 32 位 Detours 库

C/C++ Detours 库 - 在哪里可以找到?

Detours简介 (拦截x86机器上的任意的win32 API函数)