はじめに - こんにちは、お読みいただきありがとうございます。
ソースコードはありませんが、いくつかの機能を追加する必要がある DLL が 1 つあります。
Visual Studio を使用して、必要なすべての機能を C で実装する別の DLL を作成しました。
次に、この新しい DLL から生成されたコードをターゲット DLL に挿入する必要があります (実行時ではなく、ファイル レベルで行う必要があります)。
おそらく、ターゲット DLL に新しい PE セクションを作成し、作成した DLL のすべてのコード/データ/rdata をそこに置きます。問題は、ターゲット DLL に新しく挿入されたコードに関連する IAT と relocs を修正する必要があることです。
私の質問は:
それを行う最良の方法は何ですか?
Visual Studio が (ほとんど) 相対アドレス指定のみを使用してビルドするオプションを思いついた場合、それは素晴らしいことです。これにより、再配置を処理するときに多くの節約になります。すべての変数と定数を構造体にカプセル化できると思います。うまくいけば、MSVC はこの「コンテナー」構造体のアドレスを再配置し、相対アドレス指定を使用してそのメンバーにアクセスするだけで済みます。しかし、これが良いアイデアかどうかはわかりません。
さらに進んで、必要な関数モジュール (遅延ロード モジュールのようなもの) を動的にロードする関数ポインターを作成することで、IAT を取り除くこともできます。繰り返しますが、この関数ポインターを、前に述べた「コンテナー」構造体の中に入れます。
私が持っている最後のオプションは、16 進数でバイナリを手動で編集して、すべて手動で作成することです...これは、IAT エントリごとに実行してエントリを再配置するにはかなりの時間がかかるため、本当にやりたくありませんでした。 . しばらく前に PE ファイル暗号化プログラムを作成したので、内部の仕組みのほとんどを知っており、それが実行できることを知っています。あなたの考えを知りたいだけで、私を助けるためのツールが既に存在している可能性がありますか?
どんな提案でも大歓迎です!
これを読んでくれてありがとう!