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

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

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() 

最后我想获得进程的堆栈跟踪。 我怎么能得到这个?

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

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

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

Deviare API钩子设计

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

如果您需要使用Deviare API Hook在目标进程中编写代码,则可以使用Deviare自定义挂钩 。 该功能可以拦截API并异步处理已处理的参数。

而不是绕行(这是免费的32位只)或easyhook(这是,khm,有点杂乱的代码),你可能想要检查出mhook 2.4这是非常整洁的代码和BSD许可。 在x86和x64上工作,处理IP相关代码等

还有一个关于如何在现场工作的详细说明。

替代文字

至于栈回溯,你可以使用kernel32 CaptureStackBackTrace() ,或者如果你想要,可以使用dbghelp StackWalk64() 。

首先,我会高度建议,如果你想执行API挂钩,我会去easyhook: http ://easyhook.codeplex.com/(开源)。 这是一个非常好,简单的API钩子框架。

关于如何获取堆栈跟踪,我不记得具体怎么做,但检查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它提供了一个很好的解释,如何完成引擎盖(还有其他方法,除了写在那里,但仍然,这是一个非常好的文章)。

希望能帮助到你! 🙂

如果允许使用除Detours以外的其他内容,则可以安装像WinDbg这样的调试器,并将其附加到进程以获取调用堆栈。

您也可以尝试其他工具,如Process MonitorWindows Performance Toolkit ,如此处所述。