4

Win32 関数を使用して、Windows 上のプロセスによって保持されているミューテックスを閉じようとしています。これは procexp を使用して実行できますが、procexp GUI を使用せずにプログラムで実行する必要があります。

方法 1: EasyHook を使用してプロセスに dll を挿入してみました。次に、挿入されたスレッドから次の
ことを試しました。

方法 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 に答える