.net JITコンパイラをだまして別のメソッドを実行する方法はありますか?

StackOverflow https://stackoverflow.com/questions/230321

質問

さて、私のアプリケーションは(x86)命令をメモリに発行し、ページを実行可能にするとします。発行された命令ストリームを指すように、JITされていないメソッドのメソッドスタブを変更する方法はありますか?

例:

メモリ内にx86命令ストリームを作成しましたが、これは任意の処理を行います。さらに、メソッド 'int Target()'があると仮定します。まだ呼び出していないので、コンパイルされていません。次の方法があります:

  1. ターゲットのスタブへのポインターを取得
  2. 発行された命令ストリームを指すようにします。

.Netのほとんどすべてのセキュリティ機能は、このようなハイジャックを防止するように設計されていることを認識しています。しかし、たとえば、ホスティングAPIを介して可能ですか?

役に立ちましたか?

解決

はい、できます!

mscorjitのgetJitメソッドをフックします。 そして、どのメソッドでもJittingが必要になるたびに尋ねられます。 好きなものを渡すことができます。 一部の.netプロテクターはこのように機能します。

他のヒント

これは、プロファイリングAPIを介して可能です。使用したことはありませんが、TypeMockで同様の目的で使用されています。

編集:MSDNブログに素敵な投稿があったと思うので、探しに行きましょう。

編集2:Doh、最初のヒット

おっしゃるように、これは簡単ではなく、不可能な場合もあります。正しく覚えていれば、コードにはコンパイルされていないメソッドのJITコンパイラのアドレスが含まれます。そのため、このメソッドを呼び出そうとすると、JITコンパイラーがジョブを実行し、新しくコンパイルされたメソッドにアドレスを挿入します。このアドレスを変更できる場合は、独自のコードへの呼び出しを挿入できる場合があります。これを検出せずに行う方法は、私を超えています。 CLRがこの種の改ざんを検出することを期待しています。

MSILを変更しようとしていないので、プロファイリングAPIはこの場合(Leppieが示唆するように)役に立たないと思います。そうでないと思われる場合は、この記事は、 TypeMockが実行していることを実装する必要があります。

ICorProfilerを使用し、メソッドをjitの前に書き換えることができることに加えて、 ICorDebug (MDBGはインターフェースを管理しています)。ブレークポイントに到達すると、ブレークポイントを設定し、インターセプトコードに次のステートメントを設定します。このプロセスはすべてコードから実行できますが、非常に煩わしく、「ウォッチャー」が必要になります。これを調整するプロセス。

もう1つの注目に値するものは、属性を適用した場合にエントリおよび終了メソッドを提供する PostSharp プロジェクトです。 。

メモリを直接試してみることはありませんし、代わりにプロファイラAPIを使用できるかどうかもわかりません-いくつかの例がありますが、実際のドキュメントはありません。 MSDNマガジンの記事をご覧ください- .NETでMSILコードを書き換えますフレームワークプロファイリングAPI

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top