3

いくつかのシンボル(関数)をエクスポートするラッパーDLLを作成する必要があります。そのリソース内には、実際にジョブを実行する別の暗号化されたDLLが含まれています。

ラッパーDLLの初期化時に、元のDLLを復号化し、ファイルに保存して、によってアドレス空間にロードしますLoadLibrary。ただし、このDLLをファイルに保存することは避けたいと思います。

これは防弾保護を保証するものではないことを私は知っています。実際には、プロセス仮想メモリをダンプしてそこで見ることができます。また、属性を使用してファイルを作成できることも知っていFILE_FLAG_DELETE_ON_CLOSEます。これにより、プロセスが終了するとすぐにこのファイルが削除されます。しかし、それでも「ファイルからではなく」DLLをロードするオプションがあるかどうか知りたいです。

これまでのところ、私は次のことについて考えました。

  1. 適切な保護(PAGE_EXECUTE_READまたはPAGE_EXECUTE_READWRITE)を使用して仮想メモリブロックを割り当てます。できれば画像の優先ベースアドレスで。
  2. そこでDLLイメージを抽出/復号化します。
  3. イメージのベースアドレスが優先アドレスでない場合は、「手動で」再配置を実行します。つまり、再配置テーブルを分析し、画像にパッチを適用します。
  4. 画像のインポートを処理します。依存関係DLLをロードし、シンボルアドレスを入力します。
  5. 初期化関数()を呼び出しますDllMain

つまり、ローダーの仕事をすることができます。ただし、残念ながら、OSの観点からは適切にロードされたDLLではないため、上記のトリックによってロードされたDLLの動作が異なる領域がいくつかあります。これには次のものが含まれます。

  • にはDllMainDLLの「モジュールハンドル」が必要です。これは単なるベースアドレスです。このハンドルは、などのさまざまなAPI関数の呼び出しで使用できますLoadResource。それらの呼び出しはおそらく失敗します。
  • 例外処理に問題があります。OSはDLLのSAFESEHセクションを認識しないため、内部の例外処理コードは呼び出されません(64ビットDLLであるため、例外処理にSAFESEH必須です)。

ここに私の質問があります:ファイルにある必要なしにDLLをプロセスアドレス空間に適切にロードするためのAPIはありますか?その代替バリアントはLoadLibrary、たとえば、ファイルシステムファイルの代わりにファイルマッピングで機能しますか?

前もって感謝します。

4

1 に答える 1

3

はい、別のイメージのリソースにある DLL をロードして、ファイルを必要とせずに実行することができます。この記事を見てください。これはまさにあなたが望むものです。それは機能します、私はそれを試しました。

于 2012-06-26T12:14:04.900 に答える