これはひどい考えですが、この道を歩む前に実現可能かどうかを確認しています。
使用する dll、関数、署名、および引数に関する情報をシリアル化したファイルに基づいてライブラリを動的にロードできる Win32 C++ プログラムを作成する必要があります。ライブラリのロードは簡単です (LoadLibraryEx は問題なく動作します)。次に、関数ポインターを取得するのは簡単です (大したことではありません。GetProcAdderss がこれを処理します)。しかし、残りはトリッキーです。
これが私の攻撃計画です。これが最善のアプローチではない場合は、お気軽にお知らせください。
- どの DLL をロードし、どの関数を実行するかについて、ファイルからシリアル化された情報を開きます。
- DLL を取り込む LoadLibraryEx
- 関数ポインターを取得するための GetProcAddress (バイト配列を文字列にキャストした後)
- 引数 (バイト配列として読み込まれる) をメモリにバイト単位で書き込みます。
- 各引数の先頭へのアドレスを取得します (シリアル化から各引数のサイズがわかります)。
- 関数ポインターの先頭へのアセンブリ ジャンプを使用して、ヒープ上のアドレスをスタック内の引数に (逆順で) プッシュします。
- 戻り値のアドレスを実行して返す (void * ? として)
- 戻り値 (アセンブリから取得した) のメモリ アドレスと戻り値の型の値のサイズ (シリアル化から取得した) を使用して、生のバイトをファイルに書き戻します。
私の制限に注意してください:
- 実行時を除いて、署名、dll、関数名が何であるかはわかりません。
- 常にファイルから読み込まれます。
より良いアプローチはありますか?このアプローチは機能しますか?
アップデート
詳細を知りたくてこのスレッドにたどり着く人のために、私は解決策を見つけました。C では、dlopen を使用してライブラリを動的にロードできます (使いやすいように、これの winlib があります)。ロードすると、libffi を使用して関数を動的に実行できます (mac/ios/win 64 および 32 ビットをサポート)。これは、C関数とプリミティブ型(ポインター、uint、int、double、float)のみを取得し、それについてです。ただし、macosx Objective-C ブリッジを使用すると、libobjc (osx のネイティブ obj-c から c への「フリーダイヤル」ブリッジ) をロードすることで Objective-C にアクセスできます。次に、obj-c および c++ クラスを動的に作成します。C# とそのマーシャリング機能を使用して、Windows でも同様の手法を実行できます。
これによりオーバーヘッドが高くなり、メモリについて非常に注意する必要があります。また、C/C#/C++ からのポインターを混在させないでください。最後に、何をするにしても、実行時に。自分のタイプを知っていることを絶対に確認してください....真剣に。ところで、libffi/cinvoke、素晴らしいライブラリです。