4

我正在尝试使用 Win32 函数关闭由 Windows 上的进程持有的互斥锁。这可以使用 procexp 完成,但我需要在不使用 procexp GUI 的情况下以编程方式完成。

方法 1: 我尝试使用 EasyHook 将 dll 注入进程,然后从注入的线程尝试以下操作: - OpenMutex
- ReleaseMutex 它给了我 ERROR_NOT_OWNER 错误,可能是因为在与调用 AcquireMutex 的线程不同的线程上调用了释放。

方法2: 注入dll后,我尝试使用mHook钩住CreateMutex。挂钩的 CreateMutex 只是回调了原来的 CreateMutex。但这只会使应用程序崩溃。

我可以使用 procexp 来关闭互斥体,但我需要以编程方式进行。procexp 是如何做到的?如何在没有任何内核模式代码的情况下以编程方式完成?

4

2 回答 2

7

使用NtQuerySystemInformation()检索打开的句柄数组,循环遍历数组,直到在目标进程中找到所需的互斥句柄,然后DuplicateHandle()通过指定DUPLICATE_CLOSE_SOURCE标志来关闭它。

以下文章更详细地解释了它:

HOWTO:枚举句柄

于 2013-04-30T23:48:59.307 回答
0

只需添加一个完整的答案。识别互斥体后,我必须将以下代码添加到handles.cpp:

     HANDLE realHandle;  
     ret = DuplicateHandle(processHandle, (HANDLE)handle.Handle, GetCurrentProcess(), &realHandle, 0, TRUE, DUPLICATE_CLOSE_SOURCE);  

         if(!ret)  
               printf("DuplicateHandle Problem!");  

         if (!CloseHandle(realHandle))  
    {  
      printf("Problem closing the copied handle");  
    }  
    printf("", realHandle);  
  }  
于 2013-05-01T20:25:23.927 回答