How to use .net cil jmp opcode

旧街凉风 提交于 2020-01-24 10:47:06

问题


I'm trying to get the jmp opcode to work in Cil

jmp  void ILTest.Program::MyFunc2(int32)

ilasm is fine with it, but when I run the program I always get "common language runtime detects an invalid program" exception.

I know this is unverifiable code so I have tried to give permissions

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

but it does not seem to have any effect.

Has anyone got a program using 'jmp' working?


回答1:


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.




回答2:


One thing to keep in mind is that all assemblies and dynamicmethods have their own sets of metadata tokens, that are used to reference other methods, fields, and types. So when replacing IL code of an existing assembly you can only use tokens that have already been used in that assembly (in other classes and methods). Most likely you cannot allocate new tokens after assembly has already been built. (at least it's my hunch)

Also I think there are two ways of "jumping" from one assembly to another. One is using DynamicMethod.Invoke, another is prebuilding a dummy method, and parsing destination method token from it's IL code. In my project I ended up needing both, so good luck. :)

Also when replacing an existing method's IL code you need to have big enough "max stack" value, and somehow make sure that there's enough local variables for your new code.

Unfortunately .net runtime exceptions are really generic, and never tell you what went wrong. So, be prepared for having lots of small test cases, for testing your solutions on various methods.

Here's also some useful links:

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



来源:https://stackoverflow.com/questions/12141112/how-to-use-net-cil-jmp-opcode

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!