如何使用.net cil jmp操作码

时间:2012-08-27 11:29:11

标签: c# .net cil

我正在尝试让jmp操作码在Cil中工作

jmp  void ILTest.Program::MyFunc2(int32)

ilasm很好用,但是当我运行程序时,我总是得到“公共语言运行时检测到无效程序”异常。

我知道这是无法验证的代码,所以我试图授予权限

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

但它似乎没有任何效果。

有没有人使用'jmp'工作得到一个程序?

2 个答案:

答案 0 :(得分:3)

jmp只能跳转到与当前方法具有相同参数的方法。确保你已经在一个方法中将int32作为参数,并且你没有任何东西被推入堆栈:它必须是空的。同时确保您不在try/catch/filter/finally区块内。

如果您无法满足这些条件,请改用call

答案 1 :(得分:-1)

要记住的一件事是,所有程序集和动态方法都有自己的元数据标记集,用于引用其他方法,字段和类型。因此,当替换现有程序集的IL代码时,您只能使用已在该程序集中使用的标记(在其他类和方法中)。很可能在组装完成后你不能分配新的令牌。 (至少它是我的预感)

另外我认为有两种方式可以跳跃"从一个装配到另一个装配。一个是使用DynamicMethod.Invoke,另一个是预构建一个虚方法,并从它的IL代码中解析目标方法标记。在我的项目中,我最终需要两者,祝你好运。 :)

同样,在替换现有方法的IL代码时,您需要拥有足够大的" max stack"值,并以某种方式确保为您的新代码提供足够的局部变量。

不幸的是.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