7

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

例えば:

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

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

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

4

5 に答える 5

10

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

編集:MSDNブログに素晴らしい投稿があったと思います。それを探しに行きます。

編集2:ドー、最初のヒット

于 2008-10-23T16:03:28.033 に答える
6

はい、できます!

mscorjitのgetJitメソッドをフックします。そして、どの方法でもジッティングが必要かどうかを毎回尋ねられます。あなたはあなたが望むものは何でも渡すことができます。

一部の.NETプロテクターはこのように機能します。

于 2009-02-05T07:27:26.773 に答える
2

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

MSIL を変更しようとしているわけではないため、この場合 (Leppie が示唆するように)、プロファイリング API が役立つとは思いません。そうでないと思われる場合は、TypeMock が行っていることを実装するために何をしなければならないかを説明しているため、この記事が役に立つかもしれません。

于 2009-01-30T12:55:13.980 に答える
0

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

注目に値するもう1つの点は、属性を適用した場合に開始メソッドと終了メソッドを提供するPostSharpプロジェクトです。

于 2009-02-04T02:44:15.537 に答える
0

メモリを直接いじろうとはしませんし、代わりにプロファイラー API を使用できるかどうかもわかりません。いくつかの例がありますが、実際のドキュメントはありません。MSDN マガジンの記事 - Rewrite MSIL Code on the Fly with the .NET Framework Profiling API をご覧ください。

于 2009-02-05T07:15:34.130 に答える