1

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

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

4

1 回答 1

1

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

  1. 您需要捕获的 CreateMutexW 调用发生在进程导入的其中一个 DLL 的 DllMain 方法中,并且您正在使用 DetoursCreateProcessWithDll() 函数来注入您的代码。Detours 通过将您的 DLL 放置在进程可执行文件导入列表的末尾来注入您的 DLL,因此进程导入的所有 DLL 都将在您之前的进程中加载​​和初始化。为了克服这个问题,请尝试使用基于 CreateProcess(CREATE_SUSPENDED) 和 CreateRemoteThread() 的注入,尽管这种方法会带来自己的挑战。
  2. 第一次调用中使用的 API 不同。您是否尝试过覆盖 CreateMutexExW?您确定 ANSI 方法调用 Unicode 方法吗?

希望这可以帮助。

于 2013-01-12T16:44:04.483 回答