22

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

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

4

4 回答 4

29

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 Custom Hooks。此功能可让您拦截 API 并异步处理已处理的参数。

于 2010-12-27T15:27:04.980 回答
22

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

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

替代文字

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

于 2010-12-31T06:46:44.933 回答
17

首先,我强烈建议,如果你想执行 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 它很好地解释了它是如何完成的引擎盖(除了那里写的还有其他方法,但仍然是一篇非常好的文章)。

希望能帮助到你!:-)

于 2010-12-25T10:48:04.943 回答
3

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

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

于 2010-12-26T23:05:11.160 回答