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 can only jump to a method with the same arguments as the current method. Make sure you're already in a method taking an int32 as a parameter, and that you've nothing pushed on the stack: it must be empty. Also ensure you're not in a try/catch/filter/finally block.

If you can't meet those criteria, use a call instead.

于 2012-08-27T11:35:51.627 回答
0

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

此外,我认为有两种方式可以从一个程序集“跳转”到另一个程序集。一个是使用 DynamicMethod.Invoke,另一个是预构建一个虚拟方法,并从它的 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 回答