【问题标题】:Require specific event completion before application launch要求在应用程序启动之前完成特定事件
【发布时间】:2013-10-20 20:21:05
【问题描述】:

我正在开发一个使用 Detours 记录特定 WIN32 调用的应用程序 (DLL)。它被注入到通过过滤器的目标应用程序中。从应用程序入口点的第一条指令开始,它必须绝对记录应用程序的每次调用。

我现在正在寻找一种方法,让我的应用程序(始终运行的应用程序)尽可能快地注入 DLL,最好不要让目标应用程序进行任何其他调用。

有什么办法可以做到吗?

【问题讨论】:

  • 你要求一个钩子让你的注入在 exe 入口点之前运行。似乎有点难以置信。
  • 这怎么难以置信?一旦一个新的应用程序启动(让我们选择 notepad.exe 为例),它就会开始加载。操作系统会将程序集加载到内存中并开始执行它。在它到达 main() 方法(应用程序的入口点)之前,我需要干预并施展魔法来注入 DLL。
  • 好吧,main 不是入口点。我认为这是难以置信的,因为我认为操作系统不会给你那个钩子。当然,如果您正在启动该过程,您可以将其创建为暂停。
  • 我会尽量澄清一点。我经常使用 'procmon',Sysinternals 的进程监视器。这是我需要拦截 API 调用的那种方法,因为从程序开始到结束的每个调用都被记录在那里。
  • procmon 使用 ssdt 挂钩 IIRC

标签: c++ winapi detours


【解决方案1】:

您可以使用AppInit_DLLs registry key 将dll 加载到进程中。 dll 在DLL_PROCESS_ATTACHUser32.dll 期间加载。对于常规应用程序,这应该在运行任何应用程序代码之前发生。

请记住AppInit_DLLs should be renamed Deadlock_Or_Crash_Randomly_DLLs

【讨论】:

  • 感谢您的回答。我将对此进行评估,看看结果如何。 :)
  • 好吧,读完之后,我发现它使用起来很不稳定,而且除非用户这样做,否则 Vista 没有启用此功能。有没有办法解决这个问题?
  • 这是不稳定的,因为程序员坚持他们的DLL需要尽早注入每个进程。这听起来一定很熟悉 :) LoadAppInit_DLLs 没有被禁用。
  • 我不确定在其他平台上的可用性,但这正是我正在寻找的,并且在我的 Windows XP Professional 虚拟机上完美地完成了它的工作。谢谢,接受!
【解决方案2】:

据我所知,在 Windows 中没有直接的方法。

您的选择是:

  1. 在所有进程中挂钩 CreateProcess(或更低)函数。创建新进程时,更改参数以将其创建为挂起、注入和恢复(如果需要)。
  2. 使用驱动程序。

【讨论】:

  • 你的第二点很有趣。如果创建驱动程序有哪些功能?这是否让我可以访问可能解决我的问题的东西?
  • 驱动程序不是我的经验领域,但我见过使用这种技术的hooking library
  • 您提供的链接非常好,似乎正是我想要的。你现在得到了我的支持,如果事实证明这是实现我目标的答案,我会接受。
猜你喜欢
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多