6


6

他のプログラムからファイルを隠す

別のプログラムに表示されないファイルを作成する必要があります。 たとえば、別のプログラムがフォルダ内のファイルのリストを取得するとき、特定の1つが表示されないようにします。 私は、コードをファイルシステム上のDLLファイルを隠したいプロセスに実行するDLLを注入しています。 Microsoft Visual C ++ 2010およびWindows 7を使用しています。

2 Answer


10


はい、前述したように、ファイル/フォルダー列挙APIをインターセプトし、列挙結果から特定のファイル/フォルダーを除外して、そのファイル/フォルダーを「隠す」必要があります。 これは、ユーザーモードまたはカーネルモードで実行できます。

*ユーザーモード:*ユーザーモードフックにはDLLインジェクションが含まれます。 フックできる場所はたくさんあります:+

  • IATの実行可能ファイルのフック:インポートのエントリFindXxxを見つける ターゲットプロセスのアドレステーブルを作成し、挿入されたDLLに存在するトランポリン関数のアドレスで上書きします。

  • 実行可能ファイルによってロードされたDLLのEATフック:のエントリを見つける ロードされたDLL(この場合はkernel32.dll)のエクスポートアドレステーブルにあるFindXxx APIを挿入し、挿入されたDLLにあるトランポリン関数のアドレスで上書きします。

  • インラインフック:APIコードの最初のいくつかの命令を上書きする トランポリン関数へのJMPでDLLをロードしました。

一般に、システム全体のフック(または、少なくともExplorer.exeまたはターゲットアプリケーション)が必要な場合、実行中のすべてのプロセスにDLLを挿入する必要があるため、ユーザーモードは "ugい"(管理が難しい)になりがちです。 セキュリティソフトウェアのような多くのアプリケーションには、DLLインジェクションを検出および拒否する保護メカニズムがあります。

ユーザーモードフックを実装するよりクリーンな方法は、NTDLL.dllでAPIをフックすることです(EATまたはインラインフックを使用)。 他のすべてのAPI(FindFirstFile / FindNextFileなど)は、NTDLL.dllが提供する同等のNtXxx API(NtQueryDirectoryFileなど)を呼び出します。 NtXxx APIは、INT 2E / SYSENTERを実行して制御がカーネルモードにジャンプするポイントです。

*カーネルモード:*これには、ドライバーの作成が含まれます。 繰り返しますが、カーネルモードでは、フックをインストールできる多くの場所があります。

  • SSDTフック:必要なZwXxx APIのSSDTフックをインストールします (この場合はZwQueryDirectoryFile)、対応するSSDTインデックスをドライバーのトランポリン関数のアドレスで上書きします。

  • カーネルインラインフック:NTカーネルの最初のいくつかの命令を上書きします カーネル(この場合はNtQueryDirectoryFile)が、ドライバーのトランポリン関数を指すJMPでエクスポートされたAPI。

  • ファイルシステムフィルタードライバー:これはクリーンなアプローチであり、フックはありません 関与した。 ファイルシステムフィルタードライバーをインストールし、IOCTLの読み取り/書き込み/列挙をインターセプトし、結果をフィルターで除外して、特定のファイル/フォルダーを非表示/ロックします。

カーネルモードフックは、一般に1つの「中央の場所」にインストールされるため、よりクリーンになる傾向があります。 ただし、ドライバーコードの小さな間違いや誤操作がBSODにつながる可能性があるため、非常に注意する必要があります。

PS:コードを書く仕事を楽にするために利用できる多くのフックライブラリ/フレームワークがあります。 人気のあるものは次のとおりです:+ http://www.madshi.net/madCodeHookDescription.htm + http://easyhook.codeplex.com/

PPS:ユーザーの同意なしにそのような手法を使用してファイル/フォルダーを非表示にすることは疑わしいアクションであり、問​​題になる可能性があります(Sony DRM保護ソフトウェアの問題を覚えていますか? ;))。 これがルートキットの機能です! 上記の手法を使用してファイル/フォルダーを非表示にするユーザーモードとカーネルモードのルートキットが多数あります。 上記のあらゆる種類のフックを検出および復元するために、さまざまなルートキット対策ソフトウェアが利用できます。 多くのウイルス対策ソフトウェアは、そのようなルートキットのような動作(APIフック、隠しファイル、SSDTフックなど)を検出するとフラグを立てます+


0


最も簡単な方法は、http://research.microsoft.com/en-us/projects/detours/ [Microsoft Detours]を使用して、必要な機能をオーバーライドすることです。 DLLの挿入にも使用できますが、すでにカバーされています。 他のプロセスで使用されている特定の機能がわかっている場合は、それをフックします。 そうでない場合は、ファイルの一覧表示または開くために使用されるすべての関数のビルディングブロックをフックする必要があります。 CreateFile / FindFirst / FindFirstFile / etcだけをフックするだけで、内部関数を呼び出すだけで十分です。 たとえば、実際にCreateFileAにマップするCreateFileをフックしても、プロセスはCreateFileWを使用してファイルにアクセスできます。 したがって、NtCreateFileと友人をフックする必要があります。 しかし、どのプロセスをいじっているのか知っていると思うので、どの関数をいじるのかを正確に知っています。