4

アドレス A の値を 250 ミリ秒ごとに編集するプロセスに DLL を挿入するとします。DllMain を使用する必要がありますよね?問題は、DllMain 内で待機できないことです。だったらスレッド立てればいいじゃない?それとも制限を回避しませんか?どうすればこれを行うことができますか?

また、EXE を使用するよりも、アプリケーションのメモリを編集するために DLL インジェクションを使用する利点はありますか?

また、CreateThread のスタック サイズはどのくらいにする必要がありますか? 小さすぎたり大きすぎたりするとどうなりますか?必要な金額を知るにはどうすればよいですか?

4

1 に答える 1

6

あなたの説明から、ターゲットプロセスにDLLをロードさせる方法をすでに知っているようです。私の仮定が正しければ、答えは簡単です。DLLMain からスレッドを作成し、そのスレッドにロジックを実装します。コードが以下に概説するルールを尊重している限り、問題はありません。

このドキュメントでは、DLLMain で実行できることと実行できないこと、およびその理由について説明します。

文書化されているように、DllMain 内から次のタスクを実行しないでください。

  • LoadLibrary または LoadLibraryEx を (直接または間接的に) 呼び出します。これにより、デッドロックまたはクラッシュが発生する可能性があります。
  • 他のスレッドと同期します。これにより、デッドロックが発生する可能性があります。
  • ローダー ロックの取得を待機しているコードが所有する同期オブジェクトを取得します。これにより、デッドロックが発生する可能性があります。
  • CoInitializeEx を使用して COM スレッドを初期化します。特定の条件下で、この関数は LoadLibraryEx を呼び出すことができます。
  • レジストリ関数を呼び出します。これらの関数は Advapi32.dll に実装されています。Advapi32.dll が DLL の前に初期化されていない場合、DLL が初期化されていないメモリにアクセスし、プロセスがクラッシュする可能性があります。
  • CreateProces を呼び出します。プロセスを作成すると、別の DLL を読み込むことができます。
  • ExitThread を呼び出します。DLL デタッチ中にスレッドを終了すると、ローダー ロックが再度取得され、デッドロックまたはクラッシュが発生する可能性があります。
  • CreateThread を呼び出します。スレッドの作成は、他のスレッドと同期しなければ機能しますが、危険です。
  • 名前付きパイプまたはその他の名前付きオブジェクトを作成します (Windows 2000 のみ)。Windows 2000 では、名前付きオブジェクトはターミナル サービス DLL によって提供されます。この DLL が初期化されていない場合、DLL を呼び出すと、プロセスがクラッシュする可能性があります。
  • 動的 C ランタイム (CRT) からメモリ管理機能を使用します。CRT DLL が初期化されていない場合、これらの関数を呼び出すと、プロセスがクラッシュする可能性があります。
  • User32.dll または Gdi32.dll の関数を呼び出します。一部の関数は、初期化されていない別の DLL をロードします。
  • マネージド コードを使用します。

次のタスクは、DllMain 内で安全に実行できます。

  • コンパイル時に静的データ構造とメンバーを初期化します。
  • 同期オブジェクトの作成と初期化
  • メモリを割り当て、動的データ構造を初期化します (上記の関数を避けます)。
  • スレッド ローカル ストレージ (TLS) をセットアップします。
  • ファイルを開き、読み書きします。
  • Kernel32.dll の関数を呼び出します (上記の関数を除く)。
  • グローバル ポインターを NULL に設定し、動的メンバーの初期化を延期します。Microsoft Windows Vista™ では、ワンタイム初期化関数を使用して、コード ブロックがマルチスレッド環境で 1 回だけ実行されるようにすることができます。

あなたの2番目の質問は私にはあまり明確ではありません。別のプロセスにコードを挿入するには、どこか (ブラウザ、exe など) から開始し、ターゲット プロセスのメモリに書き込み、DLL をロードする必要があります。

于 2013-04-27T17:43:23.297 に答える