2016-04-19 12 views
1

私はハンドル/フックをつまんでいて、質問があります。今、私は私が再生しているプロセスに注入するDLLを持っています。 DLLは、CloseHandle()関数をフックします。 CloseHandleをが呼び出されると、私は次の操作を行います。ハンドルが開かれている場所を見つける

int WINAPI DetourCloseHandle(HANDLE hObject) 
{ 
    OutputDebugStringA("CLOSE HADNLE"); 
    char name[MAX_PATH]; 
    GetFinalPathNameByHandle(hObject, name, MAX_PATH, FILE_NAME_NORMALIZED); 
    OutputDebugStringA(name); 

    return oCloseHandle(hObject); 
} 
この中に私の目標は、ハンドルがに開放され、ハンドルが特定のプロセスに開いている場合は、そのを読み取るためにハンドルを使用場所を把握することです

メモリを処理します。 CloseHandleが呼び出されたときに印刷されるのは、通常、アプリケーションが読み込むランダムファイルへのパスですが、ハンドルが開かれている場所の「名前」として、ランダムなASCII文字が時々印刷されることにも気付きました。 This can be seen here.

場合によっては、特定の.exeファイルへのパスも確認できます。これは珍しいことではありません。私が注入しているアプリケーションはバイナリファイルを読み書きします。私の質問は、 "名前"が、exeファイルへのパスとしてGetFinalPathNameByHandleから返されるのを見ると、ハンドルがバイナリファイル自体に対して開かれているかどうか、またはハンドルファイルが実際の実行プロセスその名前。

また、印刷されているASCII文字が何であるかについていくつかの洞察をしたいと思います。ありがとう!ランダムなデータについては

+1

関数呼び出しが成功したかどうかを確認する必要はないので、おそらく問題のハンドルがファイルハンドルではないために失敗したと考えられ、ランダムデータが何であっても印刷していますバッファーに座っている。 –

+0

あなたはcまたはC++を使用しています – Insane

+0

私はC++ atm – user3749382

答えて

1

は、あなたが貼り付け、印刷、それはおそらく前の名前で何かを行うことが名前の配列にだけ初期化されていないゴミですので、あなたは常にGetFinalPathNameByHandleの戻り値をチェックする必要がありました:

また
DWORD ret = GetFinalPathNameByHandle(hObject, name, MAX_PATH, FILE_NAME_NORMALIZED); 
if (ret) { 
    OutputDebugStringA(name); 
} else { 
    OutputDebugStringA("GetFinalPathNameByHandle"); 
    // check GetLastError() 
} 

、ノートそのGetFinalPathNameByHandle文字列をTCHAR文字列とし、OutputDebugStringAで印刷します。ですから、ANSIバージョンGetFinalPathNameByHandleAを使用するか、TCHAR name[MAX_PATH];を使用してOutputDebugStringで印刷してください。

+0

を使用しています。しかし、ハンドルが実際にプロセスまたは実際の.exeファイルに開かれているかどうかを知るにはどうすればよいですか? – user3749382

+0

@ user3749382プロセスに開かれました。プロセスが.exeファイルを開いたことを意味します。 – fluter

+0

私はあなたが理解しているとは思わない。アプリケーションがディスクから実際の.exeファイルを読み取っているだけの場合はどうなりますか?実行中のプロセス自体に開かれたハンドルが必要なので、.exeファイルではなくプロセスの実行中のメモリを読み取ることができます。それはCreateFile()を使って開いたハンドルとOpenProcess()を使って開いたハンドルのようなものです。 CreateFileを使用して作成されたハンドルは、.exeファイルに開かれ、ディスク上のバイナリファイルの内容を読み取ります。ここで、PIDを使用してOpenProcessを使用して開かれたハンドルは、そのプロセスのメモリへのハンドルです。私ははしごが必要です。 – user3749382

関連する問題