Можно ли из .exe файла получить исходный код?
Именно исходный код нельзя, если это нативное приложение, конечно. Если браузерное или еще что-то похожее — есть варианты, но там как повезет — там обычно все обфусцируется и превращается нечитаемую мешанину и проще с нуля все написать зачастую, чем реверсить этот ужас. Нативное приложение можно только дизассемблировать получив на выходе ассемблерный код и основываясь на нём можно воссоздать логику исходного кода, а названия функций, переменных и прочие уровни абстракции, не попавшие в скомпилированный результат, придется уже самостоятельно придумывать.
Ответ написан 16 окт. 2023
Комментировать
Нравится 2 Комментировать

Associate DevOps Engineer
для некоторых типов exe-шников можно, зависит от типа. Используйте дизассемблер
Ответ написан 17 окт. 2023
Как посмотреть исходный код .exe файла?
Исходный код.. . Боюсь что никак. Впрочем, есть декомпиляторы разных языков программирования, но единственный рабочий, который я видел, декомпилировал VB6. Вот ресурсы вытянуть и поменять — не проблема. Сам в свое время искал декомпилятор, откопал кучу долбанутых IDE и декомпиляторов в ассемблер, но ничего больше =(((
Источник: собственные мучения
Как правило полностью восстановить исходный код на языке высокого уровня невозможно. Значит ли это, что другие тоже не смогут восстановить исходный код Вашей программы? Хм . и да и нет .
Для начала сразу скажу, что восстановить исходный код в точности каким он был однозначно невозможно, так как не существует в мире такого декомпилятора, который бы смог сотворить такое.
После компиляции и линковки проекта и получения исполняемого файла все имена, используемые в программе конвертируются в адреса. Потеря имён означет, что декомпилятор создаст уникальное имя для каждой константы, переменной, функции и процедуры. Даже если мы и достигнем какого-то успеха в декомпиляции исполняемого файла, то получим уже другой синтаксис программы. Данная проблема связана с тем, что при компиляции практически идентичные куски кода могут быть скомпилированы в разные последовательности машинных команд (ASM), которые присутствуют в .exe файле. Естевственно декомпилятор не обладает такой степенью интеллектуальности, чтобы решить — какова же была последовательность инструкций языка высокого уровня в исходном проекте.
Вытаскиваем исходник C# из exe-файла
Рабочие компьютеры у меня меняются не так уж редко. И далеко не всегда переносится вся информация. Что-то кажется ненужным сейчас, но может понадобится в дальнейшем или просто интересно вспомнить. Так и произошло с программой «Запомни домино». На днях я просматривал исходники и не обнаружил её – и на самом деле, писал пару лет назад, все потерялось. Что ж, так как я никак не шифровал exe и знаю, на чем написано (C# Net 4.0) и нет нативного кода, то попробуем вытащить исходник.
Для этого мы воспользуемся программой .NET Reflector 8. По сути это очень хороший декомпилятор. Открываем с помощью её наш экзешник и видим кучу непонятного. Не стоит пугаться, все на самом деле очень просто. В самом низу левой панели наш открывшийся файл: пару кликов по дереву и оппа – мы открываем нашу Form1!

Правда, здесь пока только перечисление полей, но это уже что-то. Так как программа простенькая, то нам надо только найти обработчики кнопок. Кнопки всего две, немного поискав находи обработчик для первой:
private void button2_Click(object sender, EventArgs e) < int num; int num2; this.timer1.Interval = ((int) this.numericUpDown3.Value) * 0x3e8; this.labelEnd.Visible = false; this.numericUpDown2.Visible = false; this.numericUpDown3.Visible = false; this.labelChisloDomino.Visible = false; this.label1.Visible = false; this.label2.Visible = false; this.label3.Visible = false; this.label4.Visible = false; this.label5.Visible = false; Random random = new Random(); do < num = random.Next(0, 7); num2 = random.Next(0, 7); >while (num2 < num); Image image = Image.FromFile(string.Concat(new object[] < Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" >)); this.sum = num + num2; this.label1.Image = image; this.chisloDomino = (int) this.numericUpDown2.Value; if (this.chisloDomino > 1) < do < num = random.Next(0, 7); num2 = random.Next(0, 7); >while (num2 < num); image = Image.FromFile(string.Concat(new object[] < Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" >)); this.sum = (this.sum + num) + num2; this.label2.Image = image; this.label2.Visible = true; > if (this.chisloDomino > 2) < do < num = random.Next(0, 7); num2 = random.Next(0, 7); >while (num2 < num); image = Image.FromFile(string.Concat(new object[] < Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" >)); this.sum = (this.sum + num) + num2; this.label3.Image = image; this.label3.Visible = true; > if (this.chisloDomino > 3) < do < num = random.Next(0, 7); num2 = random.Next(0, 7); >while (num2 < num); image = Image.FromFile(string.Concat(new object[] < Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" >)); this.sum = (this.sum + num) + num2; this.label4.Image = image; this.label4.Visible = true; > this.label1.Visible = true; this.button2.Visible = false; this.timer1.Start(); >
Сложного здесь ничего нет. Берем число секунд, все делаем невидимым, затем рандомно вытаскиваем на свет божий необходимое число костяшек. Один интересный момент: почему-то я сделал не циклом и для каждой костяшки идет отдельный выбор, хотя все можно сократить. Видимо, я рассчитывал именно на три, как сейчас вспоминается и когда делал для четырех – просто добавил, не переделывая код.
И еще: в каждом выборе костяшки есть дополнительный цикл do while – чтобы первое число (верхней половины костяшки) было меньше нижней. Почему так? Смотрим в папку с изображениями: нумерация изображений сделана именно таким образом: от меньшего к большему – видимо, чтобы избежать повторения. Кстати, в программе не реализован поиск повторяющихся – но, видимо, мне этого и не надо было.

Ну и в конце запускаем таймер на нужное число секунд. Код таймер прост:
private void timer_Tick(object sender, EventArgs e)
После этого обработчик другой кнопки
private void button1_Click(object sender, EventArgs e) < this.label1.Visible = true; if (this.chisloDomino >1) < this.label2.Visible = true; >if (this.chisloDomino > 2) < this.label3.Visible = true; >if (this.chisloDomino > 3) < this.label4.Visible = true; >this.button1.Visible = false; this.numericUpDown1.Visible = false; this.labelEnd.Visible = true; this.numericUpDown2.Visible = true; this.labelChisloDomino.Visible = true; this.numericUpDown3.Visible = true; this.label5.Visible = true; int num = (int) this.numericUpDown1.Value; if (this.sum == num) < this.labelEnd.Text = string.Concat(new object[] < "Сумма: ", this.sum, " Ваш вариант: ", num, " Верно!" >); > else < this.labelEnd.Text = string.Concat(new object[] < "Сумма: ", this.sum, " Ваш вариант: ", num, " Неправильно." >); > this.button2.Text = "Еще раз?"; this.button2.Visible = true; >
Здесь тоже все просто. Сначала показываем, что нужно показать и скрываем, что ненужно. Затем сравниваем введённый пользователем результат и правильный и выводим ответ. Кстати, упражнение интересное, в реальности так рекомендуется тренировать внимание.
Ну и вот так просто мы достали исходный код из программы на C# с помощью .NET Reflector 8. Таким образом, если вам требуется помочь посмотреть исходники exe файла, то вы всегда можете написать мне. За небольшую плату я вам с удовольствием помогу.


Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
статьи IT, .NET Reflector, декомпиляция
Статья Как изменить код программы без исходника
Бывают ситуации, когда под рукой нет исходника, а Вам срочно требуется внести изменения в коде, написанной ранее Вами программы. Например, дано приложение «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
Первый параметр: /exe — указывает компилятору, что на выходе мы хотим получить файл с расширением .exe. Затем указываем файл, который содержит MSIL-код. С помощью второго параметра /output — указываем имя и расширение нового файла.
Если компиляции прошла успешно, то в окне консоли вы должны увидеть сообщение, которое выделено на картинке, а внутри папке “newasm” должен появиться новый файл TextEdit.exe, который теперь уже содержит новые пути к файлам.
Вот таким не сложным способом можно выйти из данной ситуации, при этом не имея исходника под рукой.
- Cоздание файла dll
- Программное выравнивание текста по ширине
- Как удалить параметр реестра Windows
Вложения
1554325668160.png
16,8 КБ · Просмотры: 499
1554325822178.png
8,4 КБ · Просмотры: 564
The Codeby
Well-known member
- Сообщения 4 680
- Реакции 6 566
The Codeby
Well-known member
30.12.2015 4 680 6 566 BIT 117
Комментарии, перенесенные из блога
Сергей
Четверг на 02:09
Здравствуйте, когда пытаюсь открыть файл exe в редакторе LD DASM у меня появляется ошибка «отсутствует допустимый заголовок CLR поэтому дизассемблирование невозможно» что это? и можно как нибудь исправить?
admin
Пятница на 10:09
Программа (файл) на каком языке написана?
Иван
Суббота на 10:09
Добрый день. Такая же ситуация. Пытаюсь открыть файл exe в редакторе LD DASM у меня появляется ошибка «отсутствует допустимый заголовок CLR поэтому дизассемблирование невозможно». Файл написан на Delphi.
admin
Воскресенье на 09:09
Привет.
Эта утилита предназначена только для просмотра кода написанного на языке IL (MSIL) — это промежуточный язык, в который компилируется код .NET языков. Полученный в результате компиляции файл (сборка) содержит CLR заголовок. Затем, во время запуска приложения, выполняется вторая компиляция, которая превращает полученный код IL в машинный.
В дельфи сборка не содержит CLR заголовок и код, если не ошибаюсь, сразу преобразуется в машинный.
Иван
Понедельник на 12:09
А как-то нормально можно посмотреть код, если есть уже окончательный exe и несколько dll проекта?
admin
Понедельник на 09:09 ПП
Что значит «нормально посмотреть код» ?
Иван
Среда на 03:09 ПП
Ну чтобы взять код себе в другой проект
admin
Четверг на 11:09
Есть вроде какие-то, но не помню названия, потому что не использую их.
Анатолий
Четверг на 12:02 ПП
Можете, помочь как я хочу переписать лаунчер для игры, что бы изменить проверку файлов но не могу никак открыть его. Пробывал через ресторатор 2007 но оно не может прочитать пату файлов точнее отобразить язык.