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

Associate DevOps Engineer
для некоторых типов exe-шников можно, зависит от типа. Используйте дизассемблер
Как отлаживать и профилировать любой EXE-файл с помощью Visual Studio
Вам когда-нибудь нужно было отлаживать или профилировать исполняемый файл (файл .exe), для которого у вас нет исходного кода или вы не можете его собрать? Тогда наименее известный тип проекта Visual Studio, проект EXE, для вас!
В Visual Studio вы можете открыть любой EXE-файл как «проект». Просто перейдите в Файл -> Открыть -> Проект/Решение и перейдите к файлу .exe . Как если бы это был файл .sln . Visual Studio откроет этот EXE-файл как проект. Эта функция существует уже давно. Она работает на всех поддерживаемых в настоящее время версиях Visual Studio, и документация по ней находится на странице Отладка приложения, которое не является частью решения Visual Studio.
Отладка
Как и в обычном проекте, вы можете начать отладку с помощью F5, которая запустит EXE и подключит отладчик. Если вы хотите отладить запуск, вы можете запустить с помощью F11, который запустит EXE и остановится на первой строке пользовательского кода. Оба эти параметра доступны в контекстном меню для проекта EXE в окне Solution Explorer, как показано ниже:

Для отладки понадобятся символы, файлы PDB, для EXE и любых DLL, которые нужно отладить. Visual Studio будет следовать тому же процессу и попытается получить символы также, как и при отладке обычного проекта. Поскольку маловероятно, что файлы PDB были распространены вместе с EXE-файлом, возможно, вы захотите найти их в сборке или, что еще лучше, на сервере символов. Дополнительную информацию и рекомендации по использованию символов можно найти в этом блоге.
Для эффективной отладки вам также понадобится исходный код, который использовался для сборки EXE, или даже для нескольких файлов, которые вас интересуют. Вам нужно найти эти файлы и открыть их в Visual Studio. Если исходный код не совпадает с исходным кодом, который был собран, EXE Visual Studio предупредит вас, когда вы попытаетесь вставить точку останова, и точка останова не будет привязана. Это поведение может быть изменено в окне Settings peek window. В окне просмотра параметров щелкните текст ссылки Must match source, а затем установите флажок, чтобы разрешить несоответствующий источник, как показано ниже. Конечно, с несоответствующим источником вы никогда не знаете, что произойдет, так что используйте это только на свой страх и риск.
Если EXE был собран с SourceLink, то информация об источнике будет включена в PDB, и Visual Studio попытается загрузить источник автоматически. Это действительно хорошая причина использовать SourceLink с вашими проектами. Даже если у вас есть локальный набор, у вас может не быть той версии, которая использовалась для сборки двоичного файла. SourceLink — ваш надежный способ убедиться, что правильный источник связан с правильным двоичным файлом.
Если вы не можете получить исходный код, у вас еще есть несколько вариантов:
- Используйте инструмент для декомпиляции сборок обратно в C#, который вы можете перекомпилировать в новую сборку, чтобы исправить старую.
- ILSpy — отличный выбор для этого, но есть и множество других хороших платных и бесплатных инструментов.
- Документ Source Not Found содержит ссылку на view disassembly. Имейте в виду, что если вы привыкли к отладке кода на C#, представление о разборке (view disassembly) является крайним средством.

Профилирование
Вы также можете использовать инструменты профилирования с EXE-файлом, запустив их из Отладка -> Профилирование производительности. На странице запуска инструментов профилирования вы можете выбрать, какие инструменты использовать против EXE. Дополнительную информацию о профилировании можно найти в этих документах ( https://docs.microsoft.com/en-us/visualstudio/profiling/profiling-feature-tour?view=vs-2019).
Заключение
Вот и все. Краткий обзор того, как вы можете использовать Visual Studio для отладки и профилирования приложений, которые вы не создаете и которые могут даже не иметь исходного кода. В следующий раз, когда вам понадобится отладить или профилировать EXE-файл, не забудьте, что вы можете открыть его как решение в Visual Studio!
- Блог компании Microsoft
- Visual Studio
Отладка исходного кода в WinDbg (классическая модель)
Исходный путь указывает каталоги, в которых находятся исходные файлы C и C++. Дополнительные сведения о просмотре исходного кода в отладчике см. в разделе Путь к источнику.
Примечание Если вы подключены к корпоративной сети, наиболее эффективным способом доступа к исходным файлам является использование исходного сервера. Исходный сервер можно использовать с помощью строки srv* в исходном пути. Дополнительные сведения об исходных серверах см. в разделе Использование исходного сервера.
Чтобы управлять исходным путем в WinDbg, выполните одно из следующих действий.
- Выберите Путь к исходному файлу в меню Файл или нажмите клавиши CTRL+P.
- Используйте команду .srcpath (Задать путь к источнику). Если вы используете исходный сервер, SRCFIX (Использовать исходный сервер) немного проще.
- Используйте команду .lsrcpath (Задать путь к локальному источнику). Если вы используете исходный сервер, .lsrcfix (Use Local Source Server) немного проще.
- При запуске отладчика используйте параметр командной строки -srcpath или -lsrcpath . См . раздел Параметры Command-Line WinDbg.
- Перед запуском отладчика задайте переменную среды _NT_SOURCE_PATH.
Открытие и закрытие исходных файлов
Чтобы открыть или закрыть исходный файл напрямую, выполните одно из указанных ниже действий.

- Выберите Файл с открытым кодом в меню Файл или нажмите клавиши CTRL+O. Вы также можете использовать кнопку Open Source file ( Примечание При использовании меню или кнопки панели инструментов для открытия исходного файла путь к нему автоматически добавляется.
- Выберите Закрыть текущее окно в меню Файл .
- Нажмите кнопку Закрыть в углу окна Источник.
- Выберите Последние файлы в меню Файл , чтобы открыть один из четырех исходных файлов, которые вы недавно открыли в WinDbg.
- Введите команду .open (файл с открытым исходным кодом).
- Введите команду lsf (загрузить или выгрузить исходный файл).
В WinDbg в окне Источник отображаются исходные файлы, загруженные в отладчик.
Открытие исходного окна
Отладчик открывает исходное окно при загрузке нового исходного файла. Чтобы восстановить или переключиться в открытое окно исходного кода, перейдите в меню Окно и выберите из списка окон в нижней части меню.
На следующем снимке экрана показан пример исходного окна.

Каждый исходный файл находится в отдельном окне исходного кода. Заголовок каждого окна источника — это полный путь к исходному файлу.
Использование исходного окна
В каждом окне «Источник» отображается текст одного исходного файла. Невозможно изменить исходный файл в отладчике. Дополнительные сведения об изменении параметров шрифта и вкладок см. в разделе Изменение свойств текста.
В каждом окне источника есть контекстное меню с дополнительными командами. Чтобы открыть меню, выберите и удерживайте (или щелкните правой кнопкой мыши) строку заголовка или щелкните значок, который отображается в правом верхнем углу окна. В следующем списке описаны некоторые команды меню:
- Установка указателя инструкции на текущую строку изменяет значение указателя инструкции на инструкцию, соответствующую текущей строке. Эта команда эквивалентна использованию команды Edit | Задайте команду Current Instruction или нажмите клавиши CTRL+SHIFT+I.
- Изменить этот файл открывает исходный файл в текстовом редакторе. Редактор определяется данными реестра редактора WinDiff или значением переменной среды WINDBG_INVOKE_EDITOR. Например, рассмотрим случай, когда значение WINDBG_INVOKE_EDITOR является следующим.
c:\my\path\myeditor.exe -file %f -line %lЦвета исходного окна и оценка при наведении курсора
Если отладчик распознает расширение имени исходного файла, в окне Источник отображаются определенные элементы синтаксиса в цвете. Чтобы отключить или изменить цвета, выполните следующие действия.
- Чтобы отключить цвета синтаксиса в одном окне, откройте контекстное меню окна Исходный код, выберите Выбрать исходный язык, а затем — .
- Чтобы отключить цвета синтаксиса для всех исходных окон, выберите Параметры в меню Вид . Затем снимите флажок Синтаксический анализ исходных языков проверка.
- Чтобы изменить цвета синтаксиса, выберите Параметры в меню Вид . Затем в области Цвета выберите элемент синтаксиса и нажмите кнопку Изменить , чтобы изменить цвет.
- Метод синтаксического анализа, используемый для выделения, определяется языком программирования, связанным с расширением файла исходного файла. Чтобы изменить язык программирования, связанный с определенным расширением файла, используйте диалоговое окно Расширения файлов для исходных языков. Чтобы открыть это диалоговое окно, выберите в меню Видпункт Расширения файлов исходного языка.
Выделена строка, представляющая текущий счетчик программы. Также выделяются строки, на которых устанавливаются точки останова.
Если выбрать окно Источник и навести указатель мыши на символ в этом окне, будет вычисляться символ. Оценка аналогична оценке, созданной командой dt (тип отображения). Чтобы отключить эту оценку, выберите Параметры в меню Вид . Затем снимите флажок Оценить при наведении проверка.
См. также раздел
Дополнительные сведения об отладке исходного кода и связанных командах см. в разделе Отладка в исходном режиме.
