Как отлаживать и профилировать любой 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
Как разложить exe файл на исходники
Читая форумы по программированию, иногда натыкаешься на вопрос типа: «У меня есть откомпилированная программа на Delphi. Как мне получить её исходный код?». Обычно такой вопрос возникает, когда программист потерял файлы проекта и у него остался только .exe. Как правило полностью восстановить исходный код на языке высокого уровня невозможно. Значит ли это, что другие тоже не смогут восстановить исходный код Вашей программы ? Хм . и да и нет .
Для начала сразу скажу, что восстановить исходный код в точности каким он был однозначно невозможно, так как не существует в мире такого декомпилятора, который бы смог сотворить такое.
После компиляции и линковки проекта и получения исполняемого файла все имена, используемые в программе конвертируются в адреса. Потеря имён означет, что декомпилятор создаст уникальное имя для каждой константы, переменной, функции и процедуры. Даже если мы и достигнем какого-то успеха в декомпиляции исполняемого файла, то получим уже другой синтаксис программы. Данная проблема связана с тем, что при компиляции практически идентичные куски кода могут быть скомпилированы в разные последовательности машинных команд (ASM), которые присутствуют в .exe файле. Естевственно декомпилятор не обладает такой степенью интеллектуальности, чтобы решить — какова же была последовательность инструкций языка высокого уровня в исходном проекте.
Когда же применяется декомпиляция ? Для этого существует довольно много причин. Вот некторые из них:
— Восстановление исходного кода;
— Перенос приложения на другую платформу;
— Определение наличия вирусов в коде программы или вредоносного кода;
— Исправление ошибок в программе, в случае, если создатель приложения не собирается этого делать 🙂Легально ли всё это ? Хотя декомпиляция и не является взломом, но утвердительно ответить на этот вопрос довольно сложно. Обычно программы защищены законом об авторских правах, однако в большинстве стран на декомпиляцию делается исключение. В часности, когда необходимо изменить интерфейс программы для конкретной страны, а сервис приложения не позволяет этого сделать.
На данный момент Borland не предоставляет никаких программных продуктов, способных декомпилировать исполняемые файлы (.exe) либо откомпилированные Delphi-модули (.dcu) в исходный код (.pas).
Если же Вы всё-таки решились попробовать декомпилировать исполняемый файл, то необходимо знать следующие вещи. Исходные коды на Delphi обычно хранятся в файлах двух типов: сам исходник в ASCII кодировке (.pas, .dpr) и файлы ресурсов (.res, .rc, .dfm, .dcr). Dfm файлы хранят в себе свойства объектов, содержащихся в форме. При создании конечного .exe, Delphi копирует в него информацию из .dfm файлов. Каждый раз, когда мы изменяем координаты формы, описания кнопок или связанные с ними события, то Delphi записывает эти изменения в .dfm (за исключением кода процедур. Он сохраняется в файлах pas/dcu ). И наконец, чтобы получить при декомпиляции файл .dfm, нужно знать — какие типы ресурсов хранятся внутри Win32 исполняемого модуля.
Все программы, скомпилированные в Delphi имеют следующие секции: CODE, DATA, BSS, .idata, tls, .rdata, .rsrc. Самые важные для декомпиляции секции CODE и .rsrc. В статье «Adding functionality to a Delphi program» приведены некоторые интересные факты о исполняемых форматах Delphi, а так же информация о классах и DFM ресурсах. В этой статье есть один интересный момент под заголовком: «Как добавить свой обработчик события в уже откомпилированный файл, например, чтобы изменять тект на кнопке».
Среди многих типов ресурсов, которые сохранены в .exe файле, интерес представляет RT_RCDATA, который хранит информацию, которая были в DFM файле перед трансляцией. Чтобы извлеч DFM данные из .exe файла, мы можем вызываться API функцией EnumResourceNames.
Исскуство декомпилирования традиционно было уделом мастеров, знакомых с ассемблером и отладчиками. Некоторые Delphi декомпиляторы создают впечатление, что любой, даже с ограниченными техническими знаниями, может изменить по своему желанию большинство исполняемых файлов Delphi.
И в заключение, если Вы заинтересовались декомпилованием, то предлагаю Вам несколько Delphi декомпиляторов:
DeDe
DeDe довольно шустрая программка, позволяющая анализировать экзешники, скомпилированные в Delphi. После декомпиляции DeDe даёт Вам следующее:
— Все dfm файлы. Вы сможете открывать их и редактировать в Delphi
— Все объявленные методы с хорошо комментированным кодом на ассемблере с ссылками на строки, импортированных функций, методов и компонент в юните, блоки Try-Except и Try-Finally.
— Большое количество дополнительной информации.
— Вы можете создать папку Delphi проекта со всеми файлами dfm, pas, dpr. Не забудьте, что pas файлы содержат ассемблерный код.Revendepro
Revendepro находит почти все структуры (классы, типы, процедуры, и т.д.) в программе, и генерирует их паскальное представление, процедуры естевственно будут представлены на языке ассемблера. К сожалению, полученный ассемблерный код не может быть заново откомпилирован. Так же доступен исходник этого декомпилятора. К сожалению, этот декомпилятор не совсем рабочий — генерирует ошибку при декомпиляции.MRIP
Позволяет извлекать из Delphi приложения любые ресурсы: курсоры, иконки, dfm файлы, pas файлы и т.д. Но главная его особенность — это способность извлекать файлы, хранящиеся в других файлах. Поддерживается более 100 форматов файлов. MRip работает под DOS.Exe2Dpr
Эта программа может восстановить частично потерянные исходники проекта. Не имеет интерфейса и работает с командной строки, например: ‘exe2dpr [-o] exeFile’ ( исходники проекта будут созданы в текущей директории).Как извлечь код программы из ехе файла?


Как вызвать запуск .ехе файла другой программы?
Запуск левой программы с под WFormМожно ли как-нибудь из ехе-файла получить дизассемблированый код
Можно ли как нибудь из ехе файла получить дизассемблированый код на FASM\MASM?
Как узнать исходный код файла-ЕХЕ для Visual Basic 6.0?
Здравствуйте! Прошу помощи. Как узнать P-Code? Научите, пожалуйста, пользоваться компиляторами и.Как средствами Delphi реализовать извлечение ехе файла при запуске ехе?
Здорова, народ. Как средствами Delphi реализовать извлечение ехе файла при запуске ехе? Заранее.895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679Точно не знаю,но кажется в домашних условиях нет.Может быть какой нибудь профессиональной платной софтиной. хотя вряд ли.


8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709na3ar1y, полностью получить исходный код — никак. Для этого используются дизассемблеры, но от них толку мало
Регистрация: 29.03.2010
Сообщений: 233ну на самом деле все зависит от дизасма) если в ассемблере разбираться и использовать иду, то все очень даже легко.
а еще вроде есть хорошие тулзы, которые смогут восстановить даже не ассемблерный код, а прямо нормальный листинг (но только для конкретного компилятора)Регистрация: 14.11.2010
Сообщений: 163
erthalion , а что за тулзы?? объясни пожалуйста )
Заблокирован
Сообщение от na3ar1y 
кто знает как извлечь код програми с ехе файла?? это возможно зделать?
иди изучай архитектуру ЭВМ долго и тщательно, паралельно практикуясь с асм. Только после того как твои мозги очистятся от текущего рака, тогда ты сможешь приступить к реверсингу и просветвлишься насчет того что такое «получить код из бинарника»
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
Сообщение от unStatiK 
иди изучай архитектуру ЭВМ долго и тщательно, паралельно практикуясь с асм. Только после того как твои мозги очистятся от текущего рака, тогда ты сможешь приступить к реверсингу и просветвлишься насчет того что такое «получить код из бинарника»
смешно, хоть и флуд.
na3ar1y, exe-файл — и есть код программы.
а то, что вы хотите получить называется листингом программы на каком-либо языке.
судя по разделу, вы хотите листинг программы на C++, или даже на Visual C++.
программы? способные выполнить ваше желание, называются декомпиляторами.
декомпиляторы для С++ — большая-большая редкость.
просто в силу того, что это язык достаточно низкого уровня, и в результате компиляции программы в exe-файл из очень-очень разных исходных листингов получаются практически идентичные исполнимые exe-файлы.можете поискать, но скорее всего, ничего, удовлетворяющего вашим требованиям вы не найдете.
Заблокирован
Сообщение от Patch 
na3ar1y, exe-файл — и есть код программы.
а то, что вы хотите получить называется листингом программы на каком-либо языке.
судя по разделу, вы хотите листинг программы на C++, или даже на Visual C++.
программы? способные выполнить ваше желание, называются декомпиляторами.
декомпиляторы для С++ — большая-большая редкость.
просто в силу того, что это язык достаточно низкого уровня, и в результате компиляции программы в exe-файл из очень-очень разных исходных листингов получаются практически идентичные исполнимые exe-файлы.можете поискать, но скорее всего, ничего, удовлетворяющего вашим требованиям вы не найдете.
ссылку на спеки ЯЗЫКА visual C++ можно предоставить, а то я что то видимо проспал.
«exe-файл — и есть код программы» . «в результате компиляции программы в exe-файл из очень-очень разных исходных листингов получаются практически идентичные исполнимые exe-файлы.» — а теперь выдыхните, соберитесь и расшифруйте сей высер гуманитария техническими терминамиРегистрация: 29.03.2010
Сообщений: 233
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
Сообщение от unStatiK 
Идиотом только и остается как смеятся, на большее они не способны.
ссылку на спеки ЯЗЫКА visual C++ можно предоставить, а то я что то видимо проспал.
«exe-файл — и есть код программы» . «в результате компиляции программы в exe-файл из очень-очень разных исходных листингов получаются практически идентичные исполнимые exe-файлы.» — а теперь выдыхните, соберитесь и расшифруйте сей высер гуманитария техническими терминамикончай выдрючиваться.
троллинг никому не интересен.
а если правда не понял — поясняю:
1)автор хочет исходник для Студии; от бишь с шаблонами диалогов, дотнетом, и прочими финтифлюшками.
это специфические реализации С++, требующие специфического декомпилятора.
обычным декомпилятором С++ ты шаблоны ресурсов для Студии не получишь.
2)есть несколько вариантов реализации одного и того-же алгоритма.
например, простейший цикл.
можно написать
for(i=. ;;)<>
а можно руками:
lebel: i = . ;делаем чего-то;goto label
а в итоге компилятор сделает ИДЕНТИЧНЫЕ exe.
т.е., как правило, восстановить исходный листинг программы на С++ невозможно в принципе. но можно получить что-то похожее.
а в языках высокого уровня листинг как правило транслируется в код (и обратно) однозначно, без таких вариантов.и хватит хамить.
я хоть в этом разделе уже и не модератор, но репу загадить могу по самый бан.Заблокирован
Сообщение от Patch 
кончай выдрючиваться.
троллинг никому не интересен.
а если правда не понял — поясняю:
1)автор хочет исходник для Студии; от бишь с шаблонами диалогов, дотнетом, и прочими финтифлюшками.
это специфические реализации С++, требующие специфического декомпилятора.
обычным декомпилятором С++ ты шаблоны ресурсов для Студии не получишь.
2)есть несколько вариантов реализации одного и того-же алгоритма.
например, простейший цикл.
можно написать
for(i=. ;<>
а можно руками:
lebel: i = . ;делаем чего-то;goto label
а в итоге компилятор сделает ИДЕНТИЧНЫЕ exe.
т.е., как правило, восстановить исходный листинг программы на С++ невозможно в принципе. но можно получить что-то похожее.
а в языках высокого уровня листинг как правило транслируется в код (и обратно) однозначно, без таких вариантов.и хватит хамить.
я хоть в этом разделе уже и не модератор, но репу загадить могу по самый бан.ну вот сейчас вменяемое объяснение. это так сложно сразу нормально писать.
То что можно только повторить примерный листинг пользуясь диззасемблером/декомпилятором это и говорилось автору сразу, но он сам этого мало понимает в силу своих очень скудных познаний (да и интелектуальный потенциал этого индивида тоже вызывает сомнения)
>>1)автор хочет исходник для Студии; от бишь с шаблонами диалогов, ДОТНЕТОМ, и прочими финтифлюшками. это специфические реализации С++с++ это не дотнет, дотнетовские проги просматриваются CLR просмоторщиками (который входит в состав студии)
Файлы с исходным кодом и исходные программы
Исходную программу можно разделить на один или несколько «исходных файлов» или «единиц преобразования». Входные данные для компилятора называются «единицей преобразования».
Синтаксис
translation-unit :
external-declaration
translation-unit external-declarationexternal-declaration :
function-definition
declarationВ статье Общие сведения об объявлениях описывается синтаксис нетерминала declaration , а в справочнике по препроцессору поясняется, как происходит обработка записи преобразования.
Описание соглашений о синтаксисе ANSI вы найдете во введении к статье Общие сведения о синтаксисе языка C.
Компонентами блока трансляции являются внешние объявления, которые включают в себя определения функций и объявления идентификаторов. Эти объявления и определения могут находиться в исходных файлах, файлах заголовков, библиотеках и других файлах, которые необходимы программе. Чтобы создать программу, необходимо скомпилировать каждый блок трансляции и скомпоновать полученный объектный файл.
Исходная программа языка C представляет собой набор директив, директив pragma, объявлений, определений, блоков операторов и функций. Для того чтобы все они были допустимыми компонентами программы на языке Microsoft C, они должны иметь синтаксис, описанный в настоящей книге. При этом они могут находиться в программе в любом порядке (в пределах описанных здесь правил). Однако от расположения этих компонентов в программе зависит то, каким образом в программе будут использоваться переменные и функции. Дополнительные сведения см. в разделах Время существования, Область, Видимость и Компоновка.
Исходные файлы не обязательно должны содержать исполняемые инструкции. К примеру, в один исходный файл можно поместить все определения переменных, а затем в другом исходном файле, в котором эти переменные используются, объявить ссылки на них. Этот метод позволяет легко находить и при необходимости изменять определения. По этой же причине константы и макросы часто организуются в отдельные файлы — так называемые включаемые файлы, или файлы заголовка. По мере необходимости на них можно ссылаться из исходных файлов. Сведения о макросах и включаемых файлах см. в справочнике по препроцессору.