1

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

4

1 回答 1

1

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

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

原则上,在基本块中使用一堆指令是可能的;但是当有控制流(传出或传入)或dup指令时,整个指令堆栈都必须转换为变量堆栈。目前,ILSpyILReader使用单通道(如 Ecma-335 规范中所指定),因此它不知道ILReader运行期间传入的控制流,因此它必须始终使用变量堆栈以确保安全。

事实证明,这不是 .NET 框架读取 IL 字节码的方式,一些混淆器正在利用这种差异。所以在未来,我们可能会重写ILReader.NET 字节码导入器的工作方式,此时我们可能会转向混合堆栈变量+指令堆栈模型。ILSpy 问题 #901

于 2019-07-26T11:48:38.830 回答