首页 > Windows开发 > 详细

.Net RuntimeExplorer开发日志(二) IL to C#

时间:2020-04-05 02:45:13      阅读:73      评论:0      收藏:0      [点我收藏+]

  清明节难得没有打扰的三天假期,全部贡献在这了。对于IL翻译回C#说实话,虽然有心理准备,但还是小瞧了它的难度,现在的卡点在流程控制语句上。

  C#的编译器有两个很重要的原则,一是平栈原则,就是尽量少的使用栈,二是顺序原则,就是IL代码尽量按书写顺序从上至下从左至右编排,所见即所得 ,即使在编译时选择了优化代码,也只有很小的差别,例如帮你取消 if () { } 这样的语句。基于此原则,将IL代码以平栈为界解析为多个表达式序列,以后的代码将以表达式为基本单位组成不同类型的语句块。

  首先是对exception的解析,根据反射方法体的ExceptionHandling获得,但实际上try catch filter finally的块结构与书写代码时还是有点不同的,这里需要重新包装一下。接下来就对每个块中的表达式序列进行解析。

  对finally块中存在的MoveNext将用于对use和foreach语句识别。

  通过观察正常未混淆的代码,发现循环语句全是以条件跳转语句向上跳为结尾,并跳至循环体开始,以此为标识分析跳转及其跳转的目标,从而将for while等循环识别。

  下面就复杂了,当表达式多足够多时,if else switch嵌套在一起,还有continue与break这类跨嵌套的跳转,目前还没有简单识别的规律,现在采用的方法是以非跳转语句为界,将跳转语句分成多个块,再进行逐个分析,但结果似乎并不准确且效率低下。

  近期的情况如上就是这些了

 

.Net RuntimeExplorer开发日志(二) IL to C#

原文:https://www.cnblogs.com/ccddnet/p/12635044.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!