【问题标题】:How does Microsoft Detours work and how do I use it to get a stack trace?Microsoft Detours 如何工作以及如何使用它来获取堆栈跟踪?
【发布时间】: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()

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

【问题讨论】:

    标签: windows detours


    【解决方案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()

      【讨论】:

      【解决方案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 所述。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-10
          • 1970-01-01
          • 1970-01-01
          • 2022-01-25
          • 2012-03-02
          • 1970-01-01
          • 2010-09-11
          相关资源
          最近更新 更多