【问题标题】:Get the callstack(s) when a kernel32.dll function is called调用 kernel32.dll 函数时获取调用堆栈
【发布时间】:2010-09-29 14:11:40
【问题描述】:

我有一个更改其当前目录的进程,我想知道它何时何地发生。我怎么能这样做?

我尝试使用 Visual Studio 在 SetCurrentDirectoryA/SetCurrentDirectoryW 中设置断点,但它不起作用。

【问题讨论】:

  • 请记住,CWD 也可以通过其他方式设置 - 例如通过 FindFirstFile;我不确定 FFF 是否在内部调用 SCD。

标签: windows debugging


【解决方案1】:

您是在调试自己的程序,还是在调试没有源代码的程序? Visual Studio 调试器在调试无源应用程序方面不是很友好;在这种情况下,我会推荐WinDbgOllyDbg - 甚至可以跳过调试器并使用EasyHook 编写一个检测记录器。

编辑:

尝试在{,,kernel32.dll}_SetCurrentDirectoryA@4 处设置断点 - 语法特殊且需要修饰名称。自己没试过,但找到了here。谷歌关键词:“visual studio breakpoint api”:)

【讨论】:

  • 我正在调试我的一个插件,该插件在我没有源代码的程序中运行。 EasyHook 似乎很有趣。
【解决方案2】:

您需要使用本机代码附加/调试进程。如果您错误地使用托管代码进行调试,您将不会遇到这些断点。

【讨论】:

  • 您应该能够在 API 入口点设置断点。您是否使用符号服务器来获取符号?如果我没记错的话,当我上次尝试执行与您正在执行的操作类似的操作时,我将断点放置在 API 函数的第一条汇编指令处。
  • 是的,我使用符号服务器,abd kernel32.dll 符号已正确加载,但我无法在 SetCurrentDirectoryA 中设置断点,至少在 Visual Studio 2005 中(它说找不到该函数)。
【解决方案3】:

您的程序可能正在使用 msvcrt 函数更改目录。 您也应该尝试在这些函数上放置断点:

_chdir
_chdrive

【讨论】:

  • 这些最终将在 kernel32 SetCurrentDirectoryA/W 函数中结束 - 更安全地打破这些并退回到用户代码。
猜你喜欢
  • 2011-11-12
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2014-04-26
  • 2019-11-22
  • 2017-06-25
  • 2013-04-03
相关资源
最近更新 更多