web-dev-qa-db-ja.com

トロイの木馬はそれ自体を隠すことができるので、その活動はタスクマネージャープロセスに表示されませんか?

悪意のあるソフトウェアがそれ自体を隠して、その活動がタスクマネージャーのプロセスのリストに表示されないようにすることはできますか?自分自身を隠して、誰かがあなたのコンピュータを制御しているときに、タスクマネージャを開いたとしても、疑わしいアクティビティが表示されないようにできますか?

はいの場合、どのようにそれを行うことができますか?この方法で隠すにはどのようなテクニックを使用できますか?

22
Steve

はい。いくつかの方法があります。

  • 実行時にタスクマネージャーのプロセスに直接パッチを適用して、列挙コードがプロセスをスキップするようにします。
  • DLLをプロセスにロードすることにより、「プロセスレス」を実行します(例:AppInit_DLLs)またはプロセスメモリにコードを挿入してスレッドを開始します(VirtualAllocEx/WriteProcessMemory/CreateRemoteThreadを使用)。
  • フックProcess32First/Process32Next列挙が実行されたときにプロセスを「スキップ」するすべてのプロセス(タスクマネージャを含む)の関数。
  • CreateToolhelp32Snapshotこれにより、マップされたセクションのメモリ(スナップショットの動作については ここ を参照)が事前に変更されるため、Process32First/Process32Next偽のデータから読み取ることになります。
  • ntdll.dll!NtQuerySystemInformationおよびSystemProcessInformationが渡された場合、結果をパッチしてプロセスをスキップします。これは、上記の呼び出しよりも低いレベルのフックです。
  • SystemProcessInformationクエリのカーネルモードハンドラーをフックするカーネルモードドライバーをロードします。 Windowsではこれの本当の名前はわかりません(ドキュメントには記載されていません)が、基本的にはこの目的のためにNtQuerySystemInformationが調べるハンドラーのテーブルがあり、正しいものをフックする必要があります。 こちら 実際のハンドラーのReactOS実装。これでは、返された構造体をいじって、プロセスが表示されないようにします。
  • [〜#〜] ssdt [〜#〜] をフックして、さまざまなプロセス列挙APIが呼び出されたときのユーザーモードとカーネルモード間の遷移をキャッチします。
  • Direct Kernel Object Manipulation (DKOM)を使用して、メモリ内のEPROCESS構造を変更し、プロセスがカーネルから完全に隠されるようにします。カーネルは、FLinkおよびBLinkフィールドをそれぞれフォワードポインターおよびバックワードポインターとして、実行中のすべてのプロセスを表す構造の循環リンクリストを維持します。これらのポインターを操作してプロセスを飛び越え、次にプロセスのポインターを操作して自分自身に戻ることにより、カーネルは列挙中にプロセスをスキップします。これは一般的なルートキット手法です。
47
Polynomial

確かに-タスクマネージャから非表示にする方法はいくつかあります。最も簡単なのは、無害な名前のプロセスを使用して、見えないところに隠すことです。別のオプションは、表示されないサブプロセスとして非表示にすることです。

また、無害な名前でサービスとしてインストールすることもできます。サービスのリストには表示されますが、タスクリストには個別に表示されません。 Googleの検索で表示される他のより複雑な方法は確かにあります。

4
Julian Knight