如何在Windows中覆盖应用程序的单实例限制?

时间:2012-11-30 10:21:05

标签: winapi ipc mutex detours

我试图覆盖我没有源代码的应用程序的单个实例限制。我知道应用程序正在使用使用CreateMutex的好方法来确定是否还有另一个实例正在运行。 (如果成功创建了互斥锁,则会继续执行,如果getlasterror指出已创建互斥锁,则会立即退出)。我发现通过嗅探Win32 api调用。 我认为使用Detours会做到这一点,但它并没有完全奏效。我正在拦截CreateMutexW,但由于某种原因,它没有捕获前四次调用它。 (我再次通过嗅探win32调用并查看互斥锁的名称来了解这些调用是什么)。我确实得到了第五个截获的,但我实际想拦截的那个是第一个。

我正在通过示例应用程序使用绕道而行。我想知道问题是绕路是否太晚或者是因为这些呼叫可能有某种保护。绕路是最好的方法吗?也许使用别的东西可能是个更好的主意?

1 个答案:

答案 0 :(得分:1)

您描述的情况可能有几个原因。以下是他们中最可能的:

  1. 您需要捕获的CreateMutexW调用发生在DllMain中 由进程导入的其中一个DLL的方法,以及您 正在使用DetoursCreateProcessWithDll()函数注入你的 码。 Detours将你的DLL放在最后 进程可执行导入列表,因此所有的DLL都是 由进程导入的内容将在内部加载和初始化 在你之前的过程。为了克服这个问题,请尝试使用 CreateProcess(CREATE_SUSPENDED)和CreateRemoteThread() - 基于 注射,虽然这种方法提出了自己的挑战。
  2. 第一次调用中使用的API不同。你有没有尝试过 重写CreateMutexExW?你确定ANSI方法调用Unicode 的?
  3. 希望这有帮助。