为什么ILSpy在堆栈上而不是在指令上添加变量?我的意思是,当从堆栈中推入或弹出堆栈时,它会添加Ldloc和Stloc指令。谁能解释为什么会有这种行为?谢谢!
答案 0 :(得分:0)
因为堆栈插槽的作用就像一个变量:它可以多次使用(例如,在if
的两个分支上使用),但是当将值压入堆栈时,指令的效果只发生一次
使用指令堆栈的反编译器将有效地导致指令的副作用发生在从堆栈中弹出值的位置。这将是程序的重新排序,可能会巧妙地改变程序的行为->错误的反编译。
原则上,在基本块内可以使用一堆指令;但是,当有控制流(传出或传入)或一条dup
指令时,则必须将整个指令栈转换为变量栈。
当前,ILSpy ILReader
使用单次传递(如Ecma-335规范中所指定),因此它不知道ILReader
运行期间的传入控制流,因此必须始终使用堆栈变量是安全的。
事实证明,.NET框架不是这样读取IL字节码的,并且某些混淆器正在利用这种差异。因此,将来,我们可能会重写ILReader
以使其更类似于.NET字节码导入器,此时,我们可能会转到变量混合堆栈+指令模型堆栈。 ILSpy issue #901