38

先日、私はこれを見ました:

http://www.edgeofnowhere.cc/viewtopic.php?p=2483118

そしてそれはDLLインジェクションの3つの異なる方法を超えています。これらをプロセスから防ぐにはどうすればよいですか?または、最低限、最初のものを防ぐにはどうすればよいですか?

リング0のドライバーが3つすべてを止める唯一の方法かもしれないと思っていましたが、コミュニティの考えを見てみたいと思います。

4

9 に答える 9

38

最善の技術的解決策は、プロセスの初期化後にローダー コードが適切に実行されないようにすることです。これを行う 1 つの方法は、NT ローダー ロックを取得することです。これにより、ローダー アクションが実行されなくなります。その他のオプションには、LoadLibrary への呼び出しを攻撃者が失敗させるようにメモリ内で直接ローダー コードにパッチを適用することが含まれます (たとえば、予想されるケースを処理するために int3 ブレークポイントと自己デバッグを挿入します)。

しかし、ハッカー (実際、リンク先のサイトを管理しているハッカー) として言えば、人々が何らかの方法でプロセスにコードを挿入するのを止めることはできません。LoadLibrary はたまたま便利なショートカットですが、いくつかの非常に複雑な ring0 コードを除けば、完全に停止することは決して望めないコードを手動でロードするさまざまな方法がたくさんあります。そして、たとえあなたがリング 0 に行ったとしても、ハッカーはすぐそばにいます。

また、DLL インジェクションには正当な用途がたくさんあります。テーマ プログラム、アクセシビリティ ツール、および OS 機能を拡張するさまざまなプログラムはすべて、潜在的に DLL インジェクションを使用して、任意のプログラムに機能を追加できます。

于 2009-05-15T16:18:34.607 に答える
14

これらの 3 つのテクニックを防御する方法:

CreateRemoteThread

LoadLibrary をフックすることで、最初の手法 (LoadLibrary を呼び出す CreateRemoteThread) を防ぐことができます。フックでは、プロセスの一部であり、ロードされる可能性があることがわかっている DLL 名のリストに対してチェックするか、ロードしたくない既知の DLL のリストに対してチェックできます。

SetLastError(ERROR_ACCESS_DENIED) をロードしたくない DLL を見つけたら、NULL を返します。エラーコードを探してコードを書く人がエラーコードを取得できるように、最後のエラーを設定しました。これは機能しているように見えますが、別のコードの方が適切かもしれません。

これにより、DLL の読み込みが停止します。

SetWindowsHookEx

CreateRemoteThread ブロッキングの同じ手法が SetWindowsHookEx でも機能すると思いますが、SetWindowsHookEx 手法がコードの読み込みを開始する前にフックをインストールできる場合に限ります (通常、アプリで最初のウィンドウが作成されたときです - その寿命の早い段階です)。 )。

コードの洞窟

ナイステクニック。以前は見られませんでした。これを防ぐことはできますが、Code Cave が LoadLibrary を直接呼び出すため、(IAT テーブルではなく) LoadLibrary エントリ ポイントをフックする必要があります。

記事の著者がコメントしたように、攻撃を受ける方法はたくさんあり、すべてを倒すのはおそらく難しいでしょう。しかし、多くの場合、特定の DLL ロード (別のフックも存在する可能性があるという事実に対応するためにサード パーティの DLL が適切に作成されていないため、ソフトウェアと互換性のない特定のサード パーティの DLL など) に対してのみ防御したいため、ブロックします。読み込みから)。

于 2010-04-07T09:40:37.303 に答える
6

このポスターは、彼がゲームのアンチハッキングに投資していることをほのめかしているので、私が考えていることに光を当てさせてください。元詐欺師として。

ゲームのアンチハッキングについての単なるポインタ。

最良の方法は、サーバーにコアゲームロジックを実行させることです。たとえば、一人称シューティングゲームでは、クライアントがサーバーに送信する動きを監視します。彼らがランダムに動き回ることを許可しないでください。サーバーに、各プレーヤーが独自のロジックに基づいている場所をクライアントに通知させます。コマンドを転送するだけではいけません。彼らは偽物である可能性があります。

ハッカーが自分のクライアントをハッキングするかどうかは誰が気にしますか?他のものでそれを拒否するだけで、すべてが良いです。スタークラフトマップハックの場合、解決策は簡単です。不明な領域のゲーム状態を公開しないでください。帯域幅も節約できます。

私はデルタフォース(古いゲーム)の大物詐欺師でした。私が使用した主なトリックは、プロセスメモリを直接変更することによってゲームのどこにでもワープすることでした。DLLは必要ありません!

于 2011-04-11T11:33:18.313 に答える
6

最善の方法は、信頼されていないプロセスが管理者アクセスを取得したり、アプリケーションと同じユーザー アカウントで実行されたりしないようにすることです。このアクセスがなければ、アプリケーションへのコード インジェクションは不可能です。そして、そのようなプロセスがそのアクセスを取得すると、別のプロセスに自分自身を注入する必要なく、あらゆる種類のいたずらを引き起こす可能性があります。注入により、簡単に隠すことができます。

于 2009-05-15T15:49:55.177 に答える
2

Ring3 ソリューションをお探しですか? もしそうなら、あなたは現在(少なくとも私の知る限り)すぐに使える状態で提供されていない追加機能をシステムに組み込みたいので、少し作業が必要になります。また、これはドライバからも可能です。実際、ほとんどの AV ソフトウェアはこの種のアクティビティを定期的に実行しています。

上記のメソッドをユーザーモードから停止することに関しては、プロセスの作成または DLL のロードへのコールバックとして自分自身を登録することはできないため、少し複雑になります。ただし、自分のプロセスが他のプロセスよりも前に開始されていると想定する場合は、CreateRemoteThread および同様の関数をグローバルにフックして、このタイプのチェックを自分で実行できます。

したがって、実際には、CreateRemoteThread がスレッドを作成する場所を確認し、満足できない場合はエラーを返す必要があります。

これにより、最初の 2 つの方法が無効になります。3 番目の方法では、元のプログラムの有効なハッシュがディスク上にある場合は、ロードする前に常にハッシュをチェックできます。ハッシュがない場合は、少なくとも誰かがそのタイプのコードを追加する単純な場所をいくつかチェックし、そこにあるとは思わない DLL (IAT や実行文字列など) を探すことができます。

それは絶対確実ではありませんが、あなたが要求した機能を提供しているようです。

于 2009-07-16T13:21:54.653 に答える
1

議論のための簡単な考え:)

コード ケーブを使用して自分のコードに CRC チェックを挿入すると、他のコード ケーブの使用が遅くなる可能性があります。

ロードされている不明な dll のプロセス モジュール リストをポーリングすると、アタッチ スレッドとメッセージ フックを使用して古いものを挿入するだけで、人々の速度が低下する可能性があります。

于 2009-07-01T10:07:22.153 に答える
0

なぜこれを防ぎたいのですか?それは実際の「ビジネス」ニーズですか、それとも「ハッキング」に対抗するための「ハッキング」に興味があるだけですか?

ユーザー権限でこれが許可されている場合、それは仕様によるものです。OS は、システムの管理者が実行するアカウントに割り当てたすべてのユーザーに機能を提供します

レイモンド・チェンはすぐにここにリンクする予定です...

于 2009-05-15T15:50:52.240 に答える
0

私は Windows API に精通しているわけではありませんが、より一般的な指針をいくつか提供できます。

  1. Windows データ実行防止 (DEP) を使用できるかどうかを確認します。リンクで概説されているプロセスはOSの観点からは有効なプロセスであるため、おそらくすべての(読み取り:ほとんどの)状況で機能するとは限りません。ただし、多層防御

  2. プロセス メソッドがアプリケーション全体でセキュリティ アクセス許可をアサートしていることを確認する

  3. メモリ空間を静的に割り当てて、そこに生成された新しいスレッドが失敗するか、既存のメモリ空間を上書きするようにします。ただし、これを検出して修正するには、おそらくかなりの量のロジックが必要になります。

  4. コードを、Windows ファイル保護の傘の下でカバーできるデバイス ドライバーまたはその他の低レベル タイプのプロセスに組み込みます。

Cthulon の回答を見たところ、彼はおそらく正しいと思います。アプリケーションでコード インジェクションを実行したい人は、その方法を見つけるでしょう。上記の手順では、少し難しくなるだけかもしれません。

お役に立てれば

于 2009-05-15T16:29:29.370 に答える