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