为什么ILSpy在堆栈中添加变量而不是指令?我的意思是,当推送或弹出堆栈时,它会添加Ldloc和Stloc指令。有人能解释为什么它有这种行为吗?谢谢!
发布于 2019-07-26 11:48:38
因为堆栈槽的作用类似于变量:它可以多次使用(例如,在if的两个分支上),但是当值被推到堆栈上时,指令的效果只发生一次。
使用指令堆栈的反编译器实际上会导致指令的副作用发生在从堆栈中弹出值的位置。这将是一个程序重新排序,可以微妙地改变程序行为->不正确的反编译。
原则上,在基本块中使用一堆指令是可能的;但是当有控制流(无论是传出的还是传入的)或dup指令时,整个指令堆栈必须转换成一个变量堆栈。目前,ILSpy ILReader使用一次传递(如Ecma-335规范中指定的那样),因此它不知道在ILReader运行期间传入的控制流,因此它必须始终使用一堆变量才能安全。
事实证明,这不是.NET框架读取IL字节码的方式,有些混淆器正在利用这种差异。因此,在将来,我们可以重写ILReader,使其更像.NET字节码导入程序,此时我们可能移到variables+stack的指令模型的混合堆栈中。ILSpy问题#901
https://stackoverflow.com/questions/52533521
复制相似问题