0

各アプリケーションにはメモリ空間があります。Windows では、すべてのプロセスが「OpenProcess」と「ReadProcessMemory/WriteProcessMemory(NtReadVirtualMemory/NtWriteVirtualMemory)」を使用して、アプリケーションのメモリを読み書きできます。

システム カーネルでは、SSDT 関数 "NtReadVirtualMemory/NtWriteVirtualMemory" をフックして、アプリケーションのメモリを読み書きするユーザーを確認できます。

質問があります: このアプリケーションのプロセスでアプリケーションのメモリを読み書きするユーザーを確認する方法はありますか?

4

1 に答える 1

4

いいえ。他のプロセス/カーネルをフックしないわけではありません(質問で述べたように、SSDTをフックすることにより)。どのプロセスがアプリケーションへのハンドルを持っているかを確認できますが、それは必ずしもそれらが実際に何かを読み書きしたことを意味するわけではありません。

どのプロセスが自分のプロセスへのハンドルを持っているかを確認するには、

  1. システム上で開いているすべてのハンドルを列挙するには、(文書化されていない) forパラメータを使用NtQuerySystemInformationして呼び出します。SystemHandleInformationSystemInformationClass
  2. DuplicateHandleaccess で呼び出してすべてのハンドルを複製しPROCESS_QUERY_INFORMATIONます (正しく思い出せば、これによりすべての非プロセス ハンドルが除外されます)。
  3. 複製されたハンドルごとに、呼び出しGetProcessIdてプロセス ID を取得します。
  4. プロセス ID がアプリケーションのプロセス ID と一致する場合、から返されProcessIdた元の構造体のフィールドを検索することで、元のハンドルの所有者を取得できます。SYSTEM_HANDLE_INFORMATIONNtQuerySystemInformation
于 2013-03-28T07:43:20.907 に答える