いくつかのシンボル(関数)をエクスポートするラッパーDLLを作成する必要があります。そのリソース内には、実際にジョブを実行する別の暗号化されたDLLが含まれています。
ラッパーDLLの初期化時に、元のDLLを復号化し、ファイルに保存して、によってアドレス空間にロードしますLoadLibrary
。ただし、このDLLをファイルに保存することは避けたいと思います。
これは防弾保護を保証するものではないことを私は知っています。実際には、プロセス仮想メモリをダンプしてそこで見ることができます。また、属性を使用してファイルを作成できることも知っていFILE_FLAG_DELETE_ON_CLOSE
ます。これにより、プロセスが終了するとすぐにこのファイルが削除されます。しかし、それでも「ファイルからではなく」DLLをロードするオプションがあるかどうか知りたいです。
これまでのところ、私は次のことについて考えました。
- 適切な保護(
PAGE_EXECUTE_READ
またはPAGE_EXECUTE_READWRITE
)を使用して仮想メモリブロックを割り当てます。できれば画像の優先ベースアドレスで。 - そこでDLLイメージを抽出/復号化します。
- イメージのベースアドレスが優先アドレスでない場合は、「手動で」再配置を実行します。つまり、再配置テーブルを分析し、画像にパッチを適用します。
- 画像のインポートを処理します。依存関係DLLをロードし、シンボルアドレスを入力します。
- 初期化関数()を呼び出します
DllMain
。
つまり、ローダーの仕事をすることができます。ただし、残念ながら、OSの観点からは適切にロードされたDLLではないため、上記のトリックによってロードされたDLLの動作が異なる領域がいくつかあります。これには次のものが含まれます。
- には
DllMain
DLLの「モジュールハンドル」が必要です。これは単なるベースアドレスです。このハンドルは、などのさまざまなAPI関数の呼び出しで使用できますLoadResource
。それらの呼び出しはおそらく失敗します。 - 例外処理に問題があります。OSはDLLの
SAFESEH
セクションを認識しないため、内部の例外処理コードは呼び出されません(64ビットDLLであるため、例外処理にSAFESEH
は必須です)。
ここに私の質問があります:ファイルにある必要なしにDLLをプロセスアドレス空間に適切にロードするためのAPIはありますか?その代替バリアントはLoadLibrary
、たとえば、ファイルシステムファイルの代わりにファイルマッピングで機能しますか?
前もって感謝します。