Как разложить exe файл на исходники
Перейти к содержимому

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

Если вы не можете получить исходный код, у вас еще есть несколько вариантов:

  1. Используйте инструмент для декомпиляции сборок обратно в C#, который вы можете перекомпилировать в новую сборку, чтобы исправить старую.
    1. ILSpy — отличный выбор для этого, но есть и множество других хороших платных и бесплатных инструментов.
    1. Документ 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’ ( исходники проекта будут созданы в текущей директории).

    Как извлечь код программы из ехе файла?

    Author24 — интернет-сервис помощи студентам

    Как вызвать запуск .ехе файла другой программы?
    Запуск левой программы с под WForm

    Можно ли как-нибудь из ехе-файла получить дизассемблированый код
    Можно ли как нибудь из ехе файла получить дизассемблированый код на FASM\MASM?

    Как узнать исходный код файла-ЕХЕ для Visual Basic 6.0?
    Здравствуйте! Прошу помощи. Как узнать P-Code? Научите, пожалуйста, пользоваться компиляторами и.

    Как средствами Delphi реализовать извлечение ехе файла при запуске ехе?
    Здорова, народ. Как средствами Delphi реализовать извлечение ехе файла при запуске ехе? Заранее.

    895 / 328 / 12
    Регистрация: 29.01.2011
    Сообщений: 1,679

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

    Эксперт JavaЭксперт С++

    8384 / 3616 / 419
    Регистрация: 03.07.2009
    Сообщений: 10,709

    na3ar1y, полностью получить исходный код — никак. Для этого используются дизассемблеры, но от них толку мало

    Регистрация: 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-declaration

    external-declaration :
    function-definition
    declaration

    В статье Общие сведения об объявлениях описывается синтаксис нетерминала declaration , а в справочнике по препроцессору поясняется, как происходит обработка записи преобразования.

    Описание соглашений о синтаксисе ANSI вы найдете во введении к статье Общие сведения о синтаксисе языка C.

    Компонентами блока трансляции являются внешние объявления, которые включают в себя определения функций и объявления идентификаторов. Эти объявления и определения могут находиться в исходных файлах, файлах заголовков, библиотеках и других файлах, которые необходимы программе. Чтобы создать программу, необходимо скомпилировать каждый блок трансляции и скомпоновать полученный объектный файл.

    Исходная программа языка C представляет собой набор директив, директив pragma, объявлений, определений, блоков операторов и функций. Для того чтобы все они были допустимыми компонентами программы на языке Microsoft C, они должны иметь синтаксис, описанный в настоящей книге. При этом они могут находиться в программе в любом порядке (в пределах описанных здесь правил). Однако от расположения этих компонентов в программе зависит то, каким образом в программе будут использоваться переменные и функции. Дополнительные сведения см. в разделах Время существования, Область, Видимость и Компоновка.

    Исходные файлы не обязательно должны содержать исполняемые инструкции. К примеру, в один исходный файл можно поместить все определения переменных, а затем в другом исходном файле, в котором эти переменные используются, объявить ссылки на них. Этот метод позволяет легко находить и при необходимости изменять определения. По этой же причине константы и макросы часто организуются в отдельные файлы — так называемые включаемые файлы, или файлы заголовка. По мере необходимости на них можно ссылаться из исходных файлов. Сведения о макросах и включаемых файлах см. в справочнике по препроцессору.

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

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