【问题标题】:How to override an application's single instance limit in Windows?如何在 Windows 中覆盖应用程序的单实例限制?
【发布时间】:2012-11-30 10:21:04
【问题描述】:

我正在尝试覆盖我没有源的应用程序的单个实例限制。我知道该应用程序正在使用使用 CreateMutex 来确定是否有另一个实例正在运行的好方法。 (如果互斥锁创建成功,它会继续,如果 getlasterror 说互斥锁已经创建,它会立即退出)。我通过嗅探 Win32 api 调用发现了这一点。 我认为使用 Detours 可以解决问题,但效果并不理想。我正在拦截 CreateMutexW,但由于某种原因,它没有捕获对它的前四个调用。 (通过嗅探 win32 调用并查看互斥体的名称,我再次知道这些调用是什么)。我确实截获了第五个,但我真正想要截获的是第一个。

我通过带有dll的示例应用程序绕道而行。我想知道问题是绕道太晚还是因为这些电话可能有某种保护。弯路是最好的方法吗?也许使用其他东西可能是一个更好的主意?

【问题讨论】:

  • 通常开发人员有充分的理由阻止他们的软件同时运行两次...
  • 这很明显,但我不会无缘无故地进行拦截。
  • 只是想确认一下 :-)

标签: winapi ipc mutex detours


【解决方案1】:

您所描述的情况可能有多种原因。以下是其中最有可能的:

  1. 您需要捕获的 CreateMutexW 调用发生在 DllMain 中 由进程导入的 DLL 之一的方法,并且您 正在使用 DetoursCreateProcessWithDll() 函数注入您的 代码。 Detours 通过将您的 DLL 放置在 处理可执行文件导入列表,因此所有 DLL 进程导入的将在 在你之前的过程。为了克服这个问题,请尝试使用 基于 CreateProcess(CREATE_SUSPENDED) 和 CreateRemoteThread() 注射,虽然这种方法提出了自己的挑战。
  2. 第一次调用中使用的 API 不同。你有没有尝试过 覆盖 CreateMutexExW?你确定 ANSI 方法调用 Unicode 那些?

希望这会有所帮助。

【讨论】:

  • 已经有一段时间没有回头看这个问题了。我在想的只是在第二个副本开始之前销毁 Mutex(我猜应该只是关闭句柄)。但是,您的方法似乎更清洁。我只是覆盖 CreateMutexW,你的意思是我也应该覆盖 CreateMutexA 吗?根据 API 嗅探器,我使用的调用是 CreateMutexW
猜你喜欢
  • 1970-01-01
  • 2012-01-27
  • 2012-10-05
  • 2021-10-26
  • 2011-09-02
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多