首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ILSpy在堆栈中添加变量而不是指令?

为什么ILSpy在堆栈中添加变量而不是指令?
EN

Stack Overflow用户
提问于 2018-09-27 09:15:51
回答 1查看 58关注 0票数 1

为什么ILSpy在堆栈中添加变量而不是指令?我的意思是,当推送或弹出堆栈时,它会添加Ldloc和Stloc指令。有人能解释为什么它有这种行为吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-26 11:48:38

因为堆栈槽的作用类似于变量:它可以多次使用(例如,在if的两个分支上),但是当值被推到堆栈上时,指令的效果只发生一次。

使用指令堆栈的反编译器实际上会导致指令的副作用发生在从堆栈中弹出值的位置。这将是一个程序重新排序,可以微妙地改变程序行为->不正确的反编译。

原则上,在基本块中使用一堆指令是可能的;但是当有控制流(无论是传出的还是传入的)或dup指令时,整个指令堆栈必须转换成一个变量堆栈。目前,ILSpy ILReader使用一次传递(如Ecma-335规范中指定的那样),因此它不知道在ILReader运行期间传入的控制流,因此它必须始终使用一堆变量才能安全。

事实证明,这不是.NET框架读取IL字节码的方式,有些混淆器正在利用这种差异。因此,在将来,我们可以重写ILReader,使其更像.NET字节码导入程序,此时我们可能移到variables+stack的指令模型的混合堆栈中。ILSpy问题#901

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52533521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档