【问题标题】:How to use .net cil jmp opcode如何使用 .net cil jmp 操作码
【发布时间】:2015-11-14 22:29:03
【问题描述】:

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

jmp  void ILTest.Program::MyFunc2(int32)

ilasm 没问题,但是当我运行程序时,我总是得到“通用语言运行时检测到无效程序”异常。

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

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

但似乎没有任何作用。

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

【问题讨论】:

  • 您能否向我们展示您可以尝试的实际代码?
  • 我正在努力解决同样的问题。你有运气吗?

标签: c# .net cil


【解决方案1】:

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

如果您不能满足这些条件,请改用call

【讨论】:

  • jmped to 方法与调用方法具有相同的签名。
  • 堆栈呢?还要确保您不在异常处理块中。
  • 我只是在试验非常简单的代码。我有一个带有“调用”的工作代码,只是用一个“jmp”替换了它。我确定问题在于 jmp 指令无法验证。如果有人有一个工作示例,那就太好了。我需要在我的实际系统中使用 jmp,因为没有机会展开堆栈。
  • @WilliamPearson 你是什么意思,“没有机会展开堆栈”?你能说得更具体点吗?
  • 谢谢老兄,你刚刚回答了我一整天的问题,我正在链接到你的答案
【解决方案2】:

要记住的一点是,所有程序集和动态方法都有自己的元数据标记集,用于引用其他方法、字段和类型。因此,在替换现有程序集的 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

【讨论】:

  • 您似乎在动态方法上花费了很多时间,并且想分享您的经验,写下答案,然后开始寻找可能从中受益的问题。这不一定是一个坏主意,但是您选择了一个错误的问题,您的答案实际上与这个问题并没有很好的关系。如果这不是你在做的,那么你可能只是误解了这个问题,但你的答案仍然没有很好的相关性。
  • 嘿,我对一个非常笼统的问题的非常具体的回答中有很多假设。仍然不是我的错误中最糟糕的。 :)
猜你喜欢
  • 2012-10-07
  • 2012-01-02
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多