Как изменить код программы, если потерян исходник
Бывают ситуации, когда под рукой нет исходника, а Вам срочно требуется внести изменения в коде, написанной ранее Вами программы. Например, дано приложение «TextEdit.exe» — текстовый редактор, написанный на языке c#, который имеет простой пользовательский интерфейс, состоящий из двух кнопок и текстового поля.
При нажатии на кнопку “Чтение” из файла 1.txt считываются и выводятся все строки в окно элемента управления textBox, а при нажатии на кнопку “Запись” данные из текстового поля сохраняются в файле 2.txt
Для хранения путей в программе используются две текстовых переменных: filePathIn и filePathOut
Прошёл год, как программа была написана и отдана заказчику, но вдруг ему потребовалось изменить имя папки, в которой должны храниться оба файла, c 123 на Text. Задача простая, но прошло уже много времени, и исходник был потерян, что делать в такой ситуации?
Для начала вспомним, как образуется .NET сборка
Полученный в результате компиляции файл (сборка) содержит внутри себя метаданные, манифест, код на языке IL (MSIL).
Метаданные — описывают типы данных и их члены
Манифест описывают саму сборку
MSIL код, полученный в результате компиляции файла исходного кода
То есть перед вами тот же исходник, только в другом формате. И для того, чтобы поработать с ним, Вам понадобиться специальный инструмент, который позволяет просматривать и редактировать данные внутри сборки.
Дизассемблер ILDASM
Данный инструмент входит состав пакета .Net Framework SDK, который является бесплатным и устанавливается вместе с Visual Studio (включая Express версию). С помощью него вы можете, как просматривать внутреннее содержимое сборки, так и изменять его.
Для удобства работы создадим отдельную папку, например: ”c:\newasm” и поместим в неё файл TextEdit.exe
Затем в меню “Пуск” открываем папку: «Visual Studio Tools»
Запускаем командную строку разработчика
Откроется консоль, вводим первую команду: ildasm. Для выполнения команды нажмите клавишу Enter.
Появиться главное окно программы.
Переместим файл сборку TextEdit.exe в окно дизассемблера ILASM, в результате отобразиться её внутреннее содержимое.
Убедимся, что в ней содержатся нужные нам данные (пути к файлам).
Два поля на месте, теперь взглянем на метаданные.
Для доступа к метаданным Вы так же можно использовать сочетание горячих клавиш: Ctrl+M. Затем с помощью кнопки Find, найдём имя одного из файлов.
Как видно присутствуют оба. Пути найдены, и теперь их нужно изменить, но все данные, в текущий момент, доступны только для просмотра, и изменить их в самой дизассемблере нельзя, поэтому воспользуемся второй возможностью данной программы и выгрузим содержимое сборки в файл.
Выгрузка данных
Выберите пункт меню File -> Dump
Появится меню. В данном примере, все пункты меню оставим без изменений и просто нажмём кнопку OK.
Появится диалоговое окно
Выберем ранее созданную папку “newasm”, затем укажем имя и тип файла и нажмём на кнопку “Сохранить”
В результате в папке “newasm” должно появиться несколько новых файлов
Закрываем окно ildasm, а так же удаляем файл Textedit.exe, больше он нам не понадобиться. Теперь нас интересует полученный файл texted.il и для начала откроем его любым текстовым редактором, например блокнотом.
Снова воспользуемся поиском (Ctrl+F)
Так же видим найденные строки, которые содержат пути к файлам.
Изменим текущее имя папки 123 на новое название Text, для обоих файлов
Сохраняем внесённые изменения и закрываем блокнот.
Ассемблер ILASM
Изменения внесены и теперь нужно преобразовать файл txted.il обратно в исполняемый файл (.exe) Для этого нам понабиться второй инструмент ILASM, ассемблер, который так же входит в состав пакета SDK и не требует отдельной установки.
Возвращаемся в консоль
Вводим вторую команду:
Первый параметр: /exe — указывает компилятору, что на выходе мы хотим получить файл с расширением .exe. Затем указываем файл, который содержит MSIL-код. С помощью второго параметра /output — указываем имя и расширение нового файла.
Если компиляции прошла успешно, то в окне консоли вы должны увидеть сообщение, которое выделено на картинке, а внутри папке “newasm” должен появиться новый файл TextEdit.exe, который теперь уже содержит новые пути к файлам.
Вот таким не сложным способом можно выйти из данной ситуации, при этом не имея исходника под рукой.
Читайте также:
Бывают ситуации, когда под рукой нет исходника, а Вам срочно требуется внести изменения в коде, написанной ранее Вами программы. Например, дано приложение «TextEdit.exe» — текстовый редактор, написанный на языке c#, который имеет простой пользовательский интерфейс, состоящий из двух кнопок и текстового поля.
При нажатии на кнопку “Чтение” из файла 1.txt считываются и выводятся все строки в окно элемента управления textBox, а при нажатии на кнопку “Запись” данные из текстового поля сохраняются в файле 2.txt
Для хранения путей в программе используются две текстовых переменных: filePathIn и filePathOut
Прошёл год, как программа была написана и отдана заказчику, но вдруг ему потребовалось изменить имя папки, в которой должны храниться оба файла, c 123 на Text. Задача простая, но прошло уже много времени, и исходник был потерян, что делать в такой ситуации?
Для начала вспомним, как образуется .NET сборка
Полученный в результате компиляции файл (сборка) содержит внутри себя метаданные, манифест, код на языке IL (MSIL).
Метаданные — описывают типы данных и их члены
Манифест описывают саму сборку
MSIL код, полученный в результате компиляции файла исходного кода
То есть перед вами тот же исходник, только в другом формате. И для того, чтобы поработать с ним, Вам понадобиться специальный инструмент, который позволяет просматривать и редактировать данные внутри сборки.
Дизассемблер ILDASM
Данный инструмент входит состав пакета .Net Framework SDK, который является бесплатным и устанавливается вместе с Visual Studio (включая Express версию). С помощью него вы можете, как просматривать внутреннее содержимое сборки, так и изменять его.
Для удобства работы создадим отдельную папку, например: ”c:\newasm” и поместим в неё файл TextEdit.exe
Затем в меню “Пуск” открываем папку: «Visual Studio Tools»
Запускаем командную строку разработчика
Откроется консоль, вводим первую команду: ildasm. Для выполнения команды нажмите клавишу Enter.
Появиться главное окно программы.
Переместим файл сборку TextEdit.exe в окно дизассемблера ILASM, в результате отобразиться её внутреннее содержимое.
Убедимся, что в ней содержатся нужные нам данные (пути к файлам).
Два поля на месте, теперь взглянем на метаданные.
Для доступа к метаданным Вы так же можно использовать сочетание горячих клавиш: Ctrl+M. Затем с помощью кнопки Find, найдём имя одного из файлов.
Как видно присутствуют оба. Пути найдены, и теперь их нужно изменить, но все данные, в текущий момент, доступны только для просмотра, и изменить их в самой дизассемблере нельзя, поэтому воспользуемся второй возможностью данной программы и выгрузим содержимое сборки в файл.
Выгрузка данных
Выберите пункт меню File -> Dump
Появится меню. В данном примере, все пункты меню оставим без изменений и просто нажмём кнопку OK.
Появится диалоговое окно
Выберем ранее созданную папку “newasm”, затем укажем имя и тип файла и нажмём на кнопку “Сохранить”
В результате в папке “newasm” должно появиться несколько новых файлов
Закрываем окно ildasm, а так же удаляем файл Textedit.exe, больше он нам не понадобиться. Теперь нас интересует полученный файл texted.il и для начала откроем его любым текстовым редактором, например блокнотом.
Снова воспользуемся поиском (Ctrl+F)
Так же видим найденные строки, которые содержат пути к файлам.
Изменим текущее имя папки 123 на новое название Text, для обоих файлов
Сохраняем внесённые изменения и закрываем блокнот.
Ассемблер ILASM
Изменения внесены и теперь нужно преобразовать файл txted.il обратно в исполняемый файл (.exe) Для этого нам понабиться второй инструмент ILASM, ассемблер, который так же входит в состав пакета SDK и не требует отдельной установки.
Код:
файл (.il) -> компилятор ilasm = сборка (.exe и .dll)
Вводим вторую команду:
Код:
ilasm /exe c:\newasm\txted.il /output=c:\newasm\textEdit.exe
Если компиляции прошла успешно, то в окне консоли вы должны увидеть сообщение, которое выделено на картинке, а внутри папке “newasm” должен появиться новый файл TextEdit.exe, который теперь уже содержит новые пути к файлам.
Вот таким не сложным способом можно выйти из данной ситуации, при этом не имея исходника под рукой.
Читайте также: