3

jmpオペコードをCilで動作させようとしています

jmp  void ILTest.Program::MyFunc2(int32)

ilasm は問題ありませんが、プログラムを実行すると、常に「共通言語ランタイムが無効なプログラムを検出しました」という例外が発生します。

これは検証不可能なコードであることを知っているので、許可を与えようとしました

SecurityPermission perm = new SecurityPermission(SecurityPermissionFlag.Execution | SecurityPermissionFlag.SkipVerification | SecurityPermissionFlag.UnmanagedCode);

しかし、それは何の効果もないようです。

「jmp」を使ったプログラムを動かした人はいますか?

4

2 に答える 2

5

jmp現在のメソッドと同じ引数を持つメソッドにのみジャンプできます。パラメータとしてを受け取るメソッドにすでに入っていることint32、およびスタックに何もプッシュしていないことを確認してください。スタックは空でなければなりません。try/catch/filter/finallyまた、ブロック内にいないことを確認してください。

これらの基準を満たすことができない場合は、call代わりに a を使用してください。

于 2012-08-27T11:35:51.627 に答える
0

すべてのアセンブリと動的メソッドには、他のメソッド、フィールド、および型を参照するために使用される独自のメタデータ トークンのセットがあることに注意してください。そのため、既存のアセンブリの IL コードを置き換える場合、そのアセンブリ (他のクラスやメソッド) で既に使用されているトークンのみを使用できます。ほとんどの場合、アセンブリが既にビルドされた後に新しいトークンを割り当てることはできません。(少なくともそれは私の予感です)

また、あるアセンブリから別のアセンブリに「ジャンプ」する方法は 2 つあります。1 つは DynamicMethod.Invoke を使用しており、もう 1 つはダミー メソッドを事前に構築し、その IL コードから宛先メソッド トークンを解析しています。私のプロジェクトでは、両方が必要になったので、頑張ってください。:)

また、既存のメソッドの IL コードを置き換えるときは、十分に大きな「最大スタック」値が必要であり、何らかの形で新しいコードに十分なローカル変数があることを確認してください。

残念ながら、.net ランタイム例外は非常に一般的なものであり、何が問題なのかはわかりません。そのため、さまざまな方法でソリューションをテストするために、小さなテスト ケースを多数用意する準備をしてください。

便利なリンクもいくつかあります。

http://www.codeproject.com/Articles/14058/Parsing-the-IL-of-a-Method-Body

http://blogs.msdn.com/b/haibo_luo/archive/2006/11/07/turn-methodinfo-to-dynamicmethod.aspx

http://www.codeproject.com/script/Content/ViewAssociatedFile.aspx?rzp=%2Fkb%2Fdotnet%2Fdotnetinternals_injection%2Frbcoree.zip&zep=rbcoree%2Frbcoree.cpp&obid=26060&obtid=2&ovid=1

https://www.google.fi/search?num=100&es_sm=93&q=CORINFO_METHOD_INFO&oq=CORINFO_METHOD_INFO&gs_l=serp.3...0.0.0.4517435.0.0.0.0.0.0.0.0..0.0....0... 1c..64.serp..0.0.0.cdFZu2hO9Yo

于 2015-11-14T10:36:28.277 に答える