C# から呼び出すことができる x86 アセンブラーなどはありますか? x86 命令を文字列として渡し、バイト配列を取得できるようにしたいと考えています。存在しない場合、どうすれば自分で作成できますか?
明確にするために-C#からアセンブリコードを呼び出したくありません-命令からコードをアセンブルし、バイト配列でマシンコードを取得できるようにしたいだけです。
このコード (オンザフライで生成される) を挿入して、完全に別のプロセスに挿入します。
個人的なプロジェクトで行った初期のプロトタイピングの一環として、このようなことを行うためのかなりの量のコードを書きました。文字列は必要ありません。x86 オペコードは X86Writer クラスのメソッドです。まったく文書化されておらず、完全にはカバーされていませんが、興味があれば、New BSD ライセンスの下で喜んでオープンソース化します。
更新: OK、私はそのプロジェクトを作成しました -- Managed.X86
Microsoft ResearchのPhoenixを見てみましょう。
C# から直接ではありません。ただし、外部アセンブラーを使用してコードをコンパイルする独自のラッパー クラスを作成する可能性があります。そのため、アセンブリをファイルに書き出し、.NET Framework を使用してアセンブラー プログラムを実行する新しいプロセスを起動し、System.IO を使用してアセンブラーによって生成されたファイルを開き、バイトを引き出す可能性があります。ストリーム。
ただし、それをすべて行ったとしても、セキュリティ上の問題に遭遇しなければ、非常に驚くでしょう. まったく異なるプロセスに実行可能コードを挿入することは、新しい OS ごとにますます不可能になっています。Vista では、間違いなく拒否されると思います。また、XP でも、別のプロセスのメモリに書き込もうとすると、アクセス拒否例外が発生すると思います。
もちろん、なぜこれを行う必要があるのかという疑問が生じます。確かにもっと良い方法があるはずです:)。
Cosmos には、x86 コードを生成するための興味深いサポートもあります。
ネイティブの Win32 dll を作成するのが最善だと思います。次に、dll からエクスポートされた関数をアセンブラーで記述できます。その後、C# を使用して dll に動的にリンクできます。
これは、文字列を渡してバイト配列を返すこととまったく同じではありません。これを行うには、x86 アセンブラー コンポーネント、または masm.exe のラッパーが必要です。
これがどのように機能するかはわかりませんが、外部コンパイラをシェル実行してから、バイト配列で生成されたオブジェクトをロードすることができます。