Почему ILSpy добавляет переменные в стек вместо инструкций? - PullRequest
0 голосов
/ 27 сентября 2018

Почему ILSpy добавляет переменные в стек вместо инструкций?Я имею в виду, что при вставке или вставке из / в стек он добавляет инструкции Ldloc и Stloc.Кто-нибудь может объяснить, почему у него такое поведение?Спасибо!

1 Ответ

0 голосов
/ 26 июля 2019

Поскольку слот стека действует как переменная: его можно использовать несколько раз (например, в обеих ветвях if), но действие инструкции происходит только один раз, когда значение помещается в стек.

Декомпилятор, который использует стек инструкций, фактически заставил бы побочные эффекты инструкции происходить в точке, где значение извлекается из стека.Это будет переупорядочение программы, которое может незначительно изменить поведение программы -> неправильная декомпиляция.

В принципе, использование стека инструкций было бы возможно в базовых блоках;но когда есть поток управления (исходящий или входящий) или инструкция dup, весь стек инструкций должен быть преобразован в стек переменных.В настоящее время ILSpy ILReader использует один проход (как указано в спецификации Ecma-335), поэтому он не знает о входящем потоке управления во время выполнения ILReader, поэтому он всегда должен использовать стек переменных, чтобыбезопасный.

Оказывается, это не то, как .NET Framework читает байт-коды IL, и некоторые обфускаторы используют это различие.Поэтому в будущем мы можем переписать ILReader, чтобы он работал больше как импортер байт-кода .NET, после чего мы могли бы перейти к смешанному стеку переменных + модель стека инструкций. Выпуск ILSpy # 901

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...