Перейти к содержимому

Как посмотреть код exe файла

  • автор:

Можно ли из .exe файла получить исходный код?

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

Ответ написан 16 окт. 2023

Комментировать

Нравится 2 Комментировать

Viji

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#, который имеет простой пользовательский интерфейс, состоящий из двух кнопок и текстового поля.

28381

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

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

28382

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

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

28383

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

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

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

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

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

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

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

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

28384

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

28385

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

28386

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

28387

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

28388

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

28389

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

28390

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

28391

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

28393

28394

28395

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

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

Выберите пункт меню File -> Dump

28396

Появится меню. В данном примере, все пункты меню оставим без изменений и просто нажмём кнопку OK.

28397

Появится диалоговое окно

28398

Выберем ранее созданную папку “newasm”, затем укажем имя и тип файла и нажмём на кнопку “Сохранить”

28399

В результате в папке “newasm” должно появиться несколько новых файлов

28400

Закрываем окно ildasm, а так же удаляем файл Textedit.exe, больше он нам не понадобиться. Теперь нас интересует полученный файл texted.il и для начала откроем его любым текстовым редактором, например блокнотом.

28401

Снова воспользуемся поиском (Ctrl+F)

28402

Так же видим найденные строки, которые содержат пути к файлам.

28403

Изменим текущее имя папки 123 на новое название Text, для обоих файлов

28404

Сохраняем внесённые изменения и закрываем блокнот.

Ассемблер ILASM

Изменения внесены и теперь нужно преобразовать файл txted.il обратно в исполняемый файл (.exe) Для этого нам понабиться второй инструмент ILASM, ассемблер, который так же входит в состав пакета SDK и не требует отдельной установки.

файл (.il) -> компилятор ilasm = сборка (.exe и .dll)

Возвращаемся в консоль

28408

Вводим вторую команду:

ilasm /exe c:\newasm\txted.il /output=c:\newasm\textEdit.exe

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

28406

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

28407

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

  • 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 но оно не может прочитать пату файлов точнее отобразить язык.

Добавить комментарий

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