Циклическая передача сборки — это декомпиляция сборки на ее IL (промежуточный язык) для ее редактирования, а затем повторная компиляция для создания сборки обратно.
В этом посте я собираюсь продемонстрировать, как выполнять циклический обход сборки .NET.
Чтобы выполнить циклический обход, нам нужно
Необходимые инструменты
- ильдасм
- Командная строка разработчика Visual Studio
- csc.exe — компилятор C#
Вот файл C#, который мы собираемся использовать для нашей демонстрации.
Я собираюсь назвать этот файл roundtrip.cs.
В командной строке разработчика VS перейдите к расположению файла roundtrip.cs. Теперь я собираюсь скомпилировать этот файл cs в сборку, в данном случае exe. Вот команда.
Создана сборка. туда и обратно.exe. Если вы запустите эту программу, вы должны получить следующий вывод. Здесь нет ничего необычного.
The answer is 30 Hello, World!
Декомпилировать в IL
Давайте создадим IL-файл для roundtrip.exe, используя ildasm с помощью следующей команды.
ildasm /out=roundtrip.il roundtrip.exe
Это создаст файл roundtrip.il с кодом IL для roundtrip.exe.
Откройте этот roundtrip.il в любом редакторе. Вы найдете весь код IL в файле. У основного метода в нашем файле C# есть соответствующий раздел в IL. Найдите следующую строку в файле IL.
.method public hidebysig static void Main() cil managed
В этом разделе вы должны найти набор инструкций, которые соответствуют объявлению и инициализации целых чисел 10, 20 соответственно. Есть строка, которую мы используем. Вы найдете это тоже.
.locals init (int32 V_0, int32 V_1)
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: stloc.0
IL_0004: ldc.i4.s 20
IL_0006: stloc.1
IL_0007: ldstr "The answer is {0}"
IL_000c: ldloc.0
IL_000d: ldloc.1
IL_000e: add
Редактировать ИЛ
Теперь для части редактирования давайте изменим операцию сложения на умножение. Заменить добавить в mul
Есть строка Hello World, давайте изменим эту строку на Hello Dev.
До:
IL_001a: ldstr "Hello, World!"
После:
IL_001a: ldstr "Hello, Dev!"
Обязательно сохраните файл IL.
Перекомпилировать в сборку
Теперь пришло время перекомпилировать. В командной строке VS dev введите следующую команду. Обратите внимание, что на этот раз мы используем ILASM, а не ILDASM. Передаем отредактированный IL-файл команде.
Если ошибок в IL нет, то следует найти новый roundtrip.exe. Когда вы запустите его, вы должны увидеть следующий вывод.
The answer is 200 Hello, Dev!
Надеюсь, вам было интересно. Спасибо за внимание.
Привет 🍺
Болели глаза?
dev.to теперь имеет темный режим.
Перейдите в раздел Разное Ваши настройки и выберите ночную тему ❤️
Первоначально опубликовано на https://dev.to 25 июня 2019 г.