Как изменить код программы без исходника

Как изменить код программы, если потерян исходник

Бывают ситуации, когда под рукой нет исходника, а Вам срочно требуется внести изменения в коде, написанной ранее Вами программы. Например, дано приложение «TextEdit.exe» — текстовый редактор, написанный на языке c#, который имеет простой пользовательский интерфейс, состоящий из двух кнопок и текстового поля.

интерфейс программы

При нажатии на кнопку “Чтение” из файла 1.txt считываются и выводятся все строки в окно элемента управления textBox, а при нажатии на кнопку “Запись” данные из текстового поля сохраняются в файле 2.txt

Для хранения путей в программе используются две текстовых переменных: filePathIn и filePathOut

исходный код программы

Прошёл год, как программа была написана и отдана заказчику, но вдруг ему потребовалось изменить имя папки, в которой должны храниться оба файла, c «123» на «Text». Задача простая, но прошло уже много времени, и исходник был потерян, что делать в такой ситуации?

Для начала вспомним, как образуется .NET сборка

.Net сборка

Полученный в результате компиляции файл (сборка) содержит внутри себя метаданные, манифест, код на языке IL (MSIL).

Метаданные — описывают типы данных и их члены

Манифест — описывают саму сборку

MSIL — код, полученный в результате компиляции файла исходного кода

То есть перед вами тот же исходник, только в другом формате. И для того, чтобы поработать с ним, Вам понадобиться специальный инструмент, который позволяет просматривать и редактировать данные внутри сборки.

Дизассемблер ILDASM

Данный инструмент входит состав пакета .Net Framework SDK, который является бесплатным и устанавливается вместе с Visual Studio (включая Express версию). С помощью него вы можете, как просматривать внутреннее содержимое сборки, так и изменять его.

Для удобства работы создадим отдельную папку, например: ”c:\newasm” и поместим в неё файл TextEdit.exe

папка с файлом

Затем в меню “Пуск” открываем папку: «Visual Studio Tools»

меню пуск

Запускаем командную строку разработчика

командная строка разработчика

Откроется консоль, вводим первую команду: ildasm. Для выполнения команды нажмите клавишу Enter.

выполнение команды в консоли

Появиться главное окно программы.

окно программы ildasm

Переместим файл сборку TextEdit.exe в окно дизассемблера ILASM, в результате отобразиться её внутреннее содержимое.

содержимое файла сборки

Убедимся, что в ней содержатся нужные нам данные (пути к файлам).

типы и члены

Два поля на месте, теперь взглянем на метаданные.

описание метаданных сборки

Для доступа к метаданным Вы так же можно использовать сочетание горячих клавиш: Ctrl+M. Затем с помощью кнопки «Find», найдём имя одного из файлов.

кнопка Find

поиск в блокноте

пути к файлам внутри .net сборки

Как видно присутствуют оба. Пути найдены, и теперь их нужно изменить, но все данные, в текущий момент, доступны только для просмотра, и изменить их в самой дизассемблере нельзя, поэтому воспользуемся второй возможностью данной программы и выгрузим содержимое сборки в файл.

Выгрузка данных

Выберите пункт меню 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

Первый параметр: /exe — указывает компилятору, что на выходе мы хотим получить файл с расширением .exe. Затем указываем файл, который содержит MSIL-код. С помощью второго параметра /output — указываем имя и расширение нового файла.

новая команда

Если компиляции прошла успешно, то в окне консоли вы должны увидеть сообщение, которое выделено на картинке, а внутри папке “newasm” должен появиться новый файл TextEdit.exe, который теперь уже содержит новые пути к файлам.

сообщение в консоли

Вот таким не сложным способом можно выйти из данной ситуации, при этом не имея исходника под рукой.

Читайте также:

11 комментариев

  1. Андрей says:

    Спасибо большое, очень помогло!

  2. Andrey says:

    Спасибо, очень интересно!

  3. Сергей says:

    Здравствуйте, когда пытаюсь открыть файл exe в редакторе LD DASM у меня появляется ошибка «отсутствует допустимый заголовок CLR поэтому дизассемблирование невозможно» что это? и можно как нибудь исправить?

  4. Программа (файл) на каком языке написана?

  5. Иван says:

    Добрый день. Такая же ситуация. Пытаюсь открыть файл exe в редакторе LD DASM у меня появляется ошибка «отсутствует допустимый заголовок CLR поэтому дизассемблирование невозможно». Файл написан на Delphi.

  6. Привет.

    Эта утилита предназначена только для просмотра кода написанного на языке IL (MSIL) — это промежуточный язык, в который компилируется код .NET языков. Полученный в результате компиляции файл (сборка) содержит CLR заголовок. Затем, во время запуска приложения, выполняется вторая компиляция, которая превращает полученный код IL в машинный.

    В дельфи сборка не содержит CLR заголовок и код, если не ошибаюсь, сразу преобразуется в машинный.

  7. Иван says:

    А как-то нормально можно посмотреть код, если есть уже окончательный exe и несколько dll проекта?

  8. Что значит «нормально посмотреть код» ?

  9. Иван says:

    Ну чтобы взять код себе в другой проект

  10. Есть вроде какие-то, но не помню названия, потому что не использую их.

  11. Анатолий says:

    Можете, помочь как я хочу переписать лаунчер для игры, что бы изменить проверку файлов но не могу никак открыть его. Пробывал через ресторатор 2007 но оно не может прочитать пату файлов точнее отобразить язык.

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*