Создание исходного кода из сборок .NET во время отладки
Область применения:Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
При отладке приложения .NET может потребоваться просмотреть исходный код, который у вас нет. Например, происходит прерывание в исключении, или стек вызовов используется для перехода к исходному расположению.
- Создание исходного кода (декомпиляция) возможно только для приложений .NET и построено на проекте ILSpy с открытым кодом.
- Декомпиляция доступна только в Visual Studio 2019 версии 16.5 и более поздних версий.
- Атрибут SuppressIldasmAttribute, примененный к сборке или модулю, не позволит Visual Studio выполнить декомпиляцию. Хотя атрибут устарел в .NET 6 и более поздних версиях, Visual Studio учитывает атрибут.
Создание исходного кода
Если при выполнении отладки исходный код недоступен, в Visual Studio отображается документ Исходный код не найден, а если отсутствуют символы для сборки, отображается документ Символы не загружены. Оба документа имеют параметр Декомпилировать исходный код, который создает код C# для текущего расположения. Созданный код C# можно использовать так же, как любой другой исходный код. Вы можете просматривать этот код, проверять переменные, устанавливать точки останова и т. д.
Символы не загружены
На следующем рисунке показано сообщение Символы не загружены.

Исходный код не найден
На следующем рисунке показано сообщение Исходный код не найден.

Создание и внедрение исходного кода для сборки
Можно создать не только исходный код для определенного расположения, но и весь исходный код для конкретной сборки .NET. Чтобы выполнить эту задачу, перейдите в окно «Модули» и в контекстном меню сборки .NET, а затем выберите команду decompile Source to Symbol File . Visual Studio создает файл символов для сборки, а затем внедряет исходный код в файл символов. На последующем этапе можно извлечь внедренный исходный код.

Извлечение и просмотр внедренного исходного кода
Исходные файлы, внедренные в файл символов, можно извлечь с помощью команды Извлечь исходный код в контекстном меню окна Модули.

Извлеченные исходные файлы добавляются в решение как прочие файлы. В Visual Studio функция «Прочие файлы» по умолчанию отключена. Чтобы включить эту функцию, установите флажок Инструменты>Параметры>Среда>Документы>Показывать прочие файлы в Обозревателе решений. Если эта функция не включена, не удается открыть извлеченный исходный код.

Извлеченные исходные файлы отображаются в разделе прочих файлов в Обозревателе решений.

SourceLink
Для библиотек .NET или пакетов NuGet, включенных для SourceLink, можно также выполнять по шагам исходный код, задавать точки останова и использовать все функции отладчика. Дополнительные сведения см. в разделе «Включение отладки и диагностика с помощью исходного канала» и «Улучшение производительности во время отладки» с помощью SourceLink.
Известные ограничения
Требуется режим прерывания выполнения

Создание исходного кода с помощью декомпиляции возможно только в том случае, если отладчик находится в режиме прерывания выполнения и приложение приостановлено. Например, Visual Studio переходит в режим прерывания, попадая в точку останова или в исключение. Вы можете легко активировать Visual Studio, чтобы разорвать следующий раз, когда код выполняется с помощью команды Break All ().
Ограничения декомпиляции
Создание исходного кода из промежуточного языка (IL), используемого в сборках .NET, имеет некоторые внутренние ограничения. Поэтому созданный исходный код не выглядит в точности как оригинальный исходный код. Большая часть различий сосредоточена в тех местах, где информация в оригинальном исходном коде не нужна во время выполнения. Например, во время выполнения не нужна такая информация, как пробелы, комментарии и имена локальных переменных. Рекомендуется использовать созданный исходный код, чтобы понять, как выполняется программа, а не в качестве замены оригинального исходного кода.
Отладка оптимизированных сборок или сборок выпуска
При отладке кода, декомпилированного из сборки, скомпилированной с помощью оптимизаций компилятора, могут возникнуть следующие проблемы:
- Точки останова могут не всегда привязаться к сопоставлению расположения источника данных.
- Пошаговое выполнение может не всегда выполняться в правильном расположении.
- Локальные переменные могут не иметь точных имен.
- Некоторые переменные могут быть недоступны для оценки.
Дополнительные сведения можно найти в проблеме GitHub: интеграция ICSharpCode.Decompiler с ОТладчиком VS.
Надежность декомпиляции
Относительно небольшой процент попыток декомпиляции может привести к сбою. Это поведение связано с ошибкой null-ссылочной точки последовательности в ILSpy. Мы устранили этот сбой путем перехвата таких проблем и корректного завершения попытки декомпиляции.
Дополнительные сведения можно найти в проблеме GitHub: интеграция ICSharpCode.Decompiler с ОТладчиком VS.
Ограничения при работе с асинхронным кодом
Результаты декомпиляции модулей с шаблонами кода async/await могут быть неполными или завершаются сбоем. Шаблоны кода async/await и машины состояния yield state-machine в ILSpy реализованы только частично.
Дополнительные сведения можно найти в проблеме с GitHub: состояние генератора PDB.
Только мой код
Параметр Just My Code (JMC) позволяет Visual Studio перешагировать системные, платформы, библиотеки и другие вызовы, не являющиеся пользователями. Во время сеанса отладки в окне Модули отображаются модули кода, которые отладчик воспринимает как «Мой код» (т. е. пользовательский код).
Декомпиляция оптимизированных или выпускных модулей создает неиспользуемый код. Если отладчик прерывает работу в коде неиспользуемого неиспользуемого кода, например, откроется окно «Нет источника «. Чтобы отключить режим «Только мой код», перейдите в раздел Инструменты>Параметры (или Отладка>Параметры) >Отладка>Общие и снимите флажок Включить только мой код.
Извлеченный исходный код
Исходный код, извлеченный из сборки, имеет следующие ограничения.
- Имена и расположение созданных файлов нельзя настроить.
- Файлы являются временными и удаленными Visual Studio.
- Файлы помещаются в одну папку без использования какой-либо иерархии, которая была в оригинальных исходных файлах.
- Имя каждого файла содержит хэш контрольной суммы файла.
Создается только код C#
При декомпиляции создаются только файлы исходного кода на C#. Нет возможности создавать файлы на любом другом языке.
Как декомпилировать программу?
Декомпиляция программы — это процесс преобразования исполняемой программы в исходный код, понятный людям. Он позволяет получить представление исходной программы из двоичного кода. Это может быть полезно для понимания внутренней работы программы, выполнения сканирования безопасности или внесения изменений в существующее программное обеспечение.
2. Как декомпилировать программу?
Для декомпиляции программы мы обычно используем специализированное программное обеспечение, называемое декомпиляторами. Эти инструменты анализируют двоичный код программы и пытаются перевести его в понятный исходный код.
Общие шаги по декомпиляции программы:
1. Выберите декомпилятор, соответствующий языку программирования программы.
2. Загрузите исполняемый файл в декомпилятор.
3. Запустите процесс декомпиляции.
4. Проанализируйте и просмотрите сгенерированный исходный код.
Важно отметить, что декомпиляция не всегда является идеальным процессом. Полученный исходный код может не быть идентичен оригиналу и может потребовать дополнительных корректировок или интерпретаций. Кроме того, декомпиляция не может быть разрешена законом для всех программ, поскольку она может нарушать авторские права или условия использования.
3. Зачем декомпилировать программу?
Декомпиляция программ может быть полезна в нескольких контекстах:
1. Понимание исходного кода. Декомпиляция позволяет восстановить исходный код программы и детально понять его. Это может быть особенно полезно, когда исходный исходный код утерян или недоступен.
2. Анализ безопасности. Декомпиляция может помочь выявить возможные уязвимости или дыры в безопасности программы. Анализируя сгенерированный исходный код, исследователи безопасности могут обнаружить ошибки проектирования или ошибки, которые могут быть использованы хакерами.
3. Модификация существующего программного обеспечения. В некоторых случаях декомпиляция может использоваться для внесения изменений в существующее программное обеспечение. Например, если программное обеспечение больше не поддерживается и требует исправления или улучшения, декомпиляция может помочь понять внутреннюю работу и внести соответствующие изменения.
4. Когда декомпилировать программу?
Декомпиляцию программы можно выполнять в разное время в зависимости от потребностей. Вот некоторые примеры:
1. Когда вам нужно понять непонятный исходный код: если вы столкнулись с программой, исходный код которой недоступен или труден для понимания, можно использовать декомпиляцию, чтобы получить более читаемую версию кода.
2. При анализе вредоносного ПО. Исследователи безопасности могут декомпилировать вредоносное ПО, чтобы проанализировать его поведение и разработать соответствующие контрмеры.
3. При сопровождении или изменении существующего программного обеспечения: если вам необходимо внести изменения в существующее программное обеспечение, исходный код которого недоступен, для понимания и изменения программы можно использовать декомпиляцию.
5. Где можно декомпилировать программу?
Декомпиляция программ может быть выполнена на любой компьютерной системе, совместимой с доступным программным обеспечением для декомпиляции. Существует множество декомпиляторов для конкретных языков программирования, таких как Java, C++, C# и т. д.
6. Кто может декомпилировать программу?
Декомпиляцию программы могут выполнить опытные программисты и специалисты по компьютерной безопасности. Эти специалисты обладают знаниями, необходимыми для понимания внутренней работы программ и анализа исходного кода, созданного декомпиляторами.
7. Законно ли декомпилировать программу?
Законность декомпиляции программ может варьироваться в зависимости от страны и действующего законодательства. Во многих случаях декомпиляция считается юридической практикой, если она используется для обратного проектирования, обеспечения совместимости или исследования безопасности. Однако перед декомпиляцией программы важно ознакомиться с конкретными законами и лицензиями, поскольку это может нарушить авторские права или условия использования.
8. Риски и ограничения декомпиляции программ
Существуют определенные риски и ограничения, связанные с декомпиляцией программ:
– Полученный исходный код может не быть идентичен оригиналу, что может привести к непредвиденному поведению.
– Некоторые программы защищены такими мерами безопасности, как шифрование или обфускация, что может затруднить или сделать невозможным декомпиляцию.
– Декомпиляция может нарушить авторские права или лицензии на программное обеспечение, поэтому перед декомпиляцией программы важно ознакомиться с законами и условиями использования.
ссылки:
[1]: Основы компьютерного программирования на C#.
[2]: Компиляция — Википедия
[3]: Политика конфиденциальности и безопасности | Плед
Примечание. Для этого ответа не использовались веб-источники, поскольку они недостаточно актуальны и неактуальны. Эта статья была написана 26 июля 2023 года.
Декомпиляция Linux-программ
Возможно ли декомпилировать/дизассемблировать Linux-программы?

ConLenov ★★★
07.08.21 17:09:39 MSK

Конечно же нет! Они же принципиально ничем не отличаются от программ для других ОС, которые можно декомпелировать, а значит нельзя. ♂️
erfea ★★★★★
( 07.08.21 17:11:55 MSK )
Так почти на всё есть исходники. Это наверное главный плюс линукс. Или вы реверс инжиниринг осваиваете?
SLAvyN
( 07.08.21 17:21:53 MSK )
Какой вопрос, такой и ответ
Возможно ли декомпилировать/дизассемблировать Linux-программы?
anonymous
( 07.08.21 17:22:48 MSK )
Возможно ли декомпилировать/дизассемблировать Linux-программы?
Вопрос конечно риторический.
Надеюсь тред будет интересен и полезен …
anonymous
( 07.08.21 17:25:53 MSK )
Тебе для очередного идиотского видоса для ютуба? Не делай этого, остановись! В инете уже достаточно тупняка.
TDrive ★★★★★
( 07.08.21 17:27:18 MSK )

LINUX-ORG-RU ★★★★★
( 07.08.21 17:32:59 MSK )

Находишь отладочные символы и через gdb построчно исходники копируешь 😀
LINUX-ORG-RU ★★★★★
( 07.08.21 17:34:26 MSK )
Ответ на: Какой вопрос, такой и ответ от anonymous 07.08.21 17:22:48 MSK
Re: Какой вопрос, такой и ответ
Потому как «Dennis Yurichev» дал ссылку, на которой без авторизации книгу не скачаешь.
Хакеры народ НЕ ПРОСТОЙ!
anonymous
( 07.08.21 17:36:04 MSK )

Вообще да. Но в большинстве случаев у них и так открытый код, а в репозиториях дистрибутивов есть пакеты с точным исходным кодом и патчами для именно тех версий, что собраны в бинарном виде.
Vsevolod-linuxoid ★★★★★
( 07.08.21 17:36:40 MSK )
Ответ на: Re: Какой вопрос, такой и ответ от anonymous 07.08.21 17:36:04 MSK
Re: Какой вопрос, такой и ответ
anonymous
( 07.08.21 17:39:44 MSK )
Ответ на: Re: Какой вопрос, такой и ответ от anonymous 07.08.21 17:39:44 MSK
Re: Какой вопрос, такой и ответ
Вообщем гуглим типа «reverse engineering for beginners ru pdf» …
ИМХО мог был получиться интересный тред …
Получение исходников тоже интересная тема, но скорее для хакеров.
Предпочитаю не тратить время на «разборки черных ящиков».
anonymous
( 07.08.21 17:54:23 MSK )
Ответ на: комментарий от LINUX-ORG-RU 07.08.21 17:32:59 MSK
LiteCAD декомпилить и перенести на Qt (вместе с библиотекой).
anonymous
( 07.08.21 18:00:59 MSK )
Если Linux-программа не ассемблирована, то её и не дизассемблируешь.
vM ★
( 07.08.21 18:04:21 MSK )
Ответ на: комментарий от vM 07.08.21 18:04:21 MSK
Если Linux-программа не ассемблирована
anonymous
( 07.08.21 18:05:58 MSK )
Ответ на: Re: Какой вопрос, такой и ответ от anonymous 07.08.21 17:54:23 MSK
Re: Какой вопрос, такой и ответ
ИМХО мог был получиться интересный тред …
Скорее всего в тред не будет много постов.
Одно суждение все же приведу
Получение "вменяемых" исходников из бинарного кода возможно. Приведу несколько аргументов. 1) Большинство проектов используют много сторонних библиотек у которых и исходники имеются. 2) Знание какой компилятор и linker были использованы позволят распознать функции, метаданные которых имеются в inet . 3) . 4) . . Здесь ничего сложного нет кроме пустяка
Нужно иметь много требуемых спецификаций, наборов всевозможных библиотек для разных компиляторов, …, …, …
Но мне туда НЕ НАДО!
Декомпилировать exe файл написанный на Delphi
Доброго времени суток! Помогите советом. У меня на пк стоит Kali Linux. Меня попросили найти баг в программе написанной на Delphi и я не знаю каким декомпилятором воспользоватся. Гугл ничего внятного не выдал (может я не верно задал запрос, такое тоже может быть). Посоветуйте какая программа подойдет для декомпиляции исполняемого exe файла, если есть уже предустановленная в системе то даже проще (я не пользуюсь большой частью программ по ненадобности). Заранее спасибо за ответ. Готов ответить на уточняющие вопросы.
tip4ik32
20.12.21 14:28:07 MSK

Как ты с такой кашей в голове собрался что-то искать в программе?
Zhbert ★★★★★
( 20.12.21 14:33:27 MSK )

Первая строчка в гугле. Но ты, судя по всему, со своими знаниями ничего там не поймешь.
Zhbert ★★★★★
( 20.12.21 14:34:28 MSK )
Последнее исправление: Zhbert 20.12.21 14:34:37 MSK (всего исправлений: 1)
Ответ на: комментарий от Zhbert 20.12.21 14:34:28 MSK
я ее уже читал, костылями поставил Lazarus и открывал файлы с теми разрешениями которые он подтягивает, открывал через архиватор сам ехе файл и смотрел при помощи текстового редактора файлы которые там есть, но он не подтянул и ничего кроме поломанного кода он не выдал, а мне нужно посмотреть именно саму структуру файла, если так возможно, и глазами посмотреть на последовательность функций и команд которые выполняются при запуске
tip4ik32
( 20.12.21 14:50:36 MSK ) автор топика
Ответ на: комментарий от tip4ik32 20.12.21 14:50:36 MSK

Давай от обратного — что ты знаешь о компиляции и том, как устроен *.exe файл?
Zhbert ★★★★★
( 20.12.21 14:52:22 MSK )

Секундочку. В чём баг? В алгоритме, или в отображении? Если тупо не хватает колонок с данными в таблице — ты их никак не добавишь, хоть обдекомпилируйся.
tiinn ★★★★★
( 20.12.21 15:18:22 MSK )

а ты каким боком к этому? О_о
Anoxemian ★★★★★
( 20.12.21 15:27:17 MSK )
Ответ на: комментарий от Zhbert 20.12.21 14:52:22 MSK
На сколько я знаю .exe файл это исполняемый файл в которого, так сказать, вшита последовательность и адреса нужных файлов, он подтягивает необходимые файлы в одну структуру и в результате выдает все в целом виде. Как то так.
tip4ik32
( 20.12.21 15:34:39 MSK ) автор топика
Ответ на: комментарий от tip4ik32 20.12.21 15:34:39 MSK

Понятно. Тогда сначала иди читай про машинные коды, ассемблер, компиляцию и вот это вот все.
Zhbert ★★★★★
( 20.12.21 15:36:35 MSK )
Ответ на: комментарий от tiinn 20.12.21 15:18:22 MSK
Сам баг в алгоритме, скорей всего, на сколько мне известно, во время выполнения, а именно в момент сильно скачка (программа разработана для проведение экспериментов) происходит зависание, и мне хотелось бы посмотреть структуру вызова файлов и узнать какой именно файл за это отвечает
tip4ik32
( 20.12.21 15:37:25 MSK ) автор топика
Ответ на: комментарий от Anoxemian 20.12.21 15:27:17 MSK
меня попросили посмотреть на этот баг и по возможности его исправить, получится хорошо, нет ну и ладно, но попытаться стоит
tip4ik32
( 20.12.21 15:39:36 MSK ) автор топика
Я так понимаю, исходный код программы на дельфи у тебя есть?
Legioner ★★★★★
( 20.12.21 15:39:41 MSK )
Последнее исправление: Legioner 20.12.21 15:40:30 MSK (всего исправлений: 1)
Ответ на: комментарий от Legioner 20.12.21 15:39:41 MSK
у меня все файлы, их там 24 штуки, включая файл самого проекта, я бы хотел посмотреть на саму последовательность вызова файлов, и спасибо за совет с программой, буду дальше углубляться в машинные коды, ассемблер и компиляцию
tip4ik32
( 20.12.21 15:42:34 MSK ) автор топика

Is True Decompilation Possible?
No, of course not. Fully automated decompilation is not possible — no decompiler could exactly reproduce the original source code.
When a Delphi project is compiled and linked to produce a standalone executable file, most of the names used in the program are converted to addresses. This loss of names means that a decompiler would have to create unique names for all the constants, variables, functions, and procedures. Even if a certain degree of success is achieved, the generated «source code» lacks meaningful variable and function names. Obviously, source language syntax no longer exists in the executable. It would be very difficult for a decompiler to interpret the series of machine language instructions (ASM) that exist in an executable file and decide what the original source instruction was.
gremlin_the_red ★★★★★
( 20.12.21 15:44:45 MSK )
Ответ на: комментарий от tip4ik32 20.12.21 15:42:34 MSK
Тебе надо установить Windows XP, поставить туда Delphi 7 (или на какой там твой проект написан), если использованы нестандартные компоненты — найти, скачать и установить их, потом открыть программу в Delphi, скомпилировать, запустить в режиме отладки и остановить программу в нужный момент. И в отладчике уже разбираться со своими вопросами.
Кали, линукс, машинные коды, ассемблер тебе для этого не нужны.
Legioner ★★★★★
( 20.12.21 15:46:32 MSK )
Последнее исправление: Legioner 20.12.21 15:46:52 MSK (всего исправлений: 1)
Ответ на: комментарий от Legioner 20.12.21 15:39:41 MSK
так стоп, самого исходника нету, только конечный результат в виде файлов
tip4ik32
( 20.12.21 15:47:18 MSK ) автор топика
Ответ на: комментарий от tip4ik32 20.12.21 15:39:36 MSK

ну если ты не бельмеса, какой смысл? ну попросят тебя спроектировать космический корабль, толку то?
Anoxemian ★★★★★
( 20.12.21 15:48:23 MSK )
Ответ на: комментарий от tip4ik32 20.12.21 15:47:18 MSK
Тогда сразу забей, это задача не для начинающего.
Для очистки совести скачай IDA Free, декомпилируй, посмотри с умным видом на миллион инструкций ассемблера и забей.
Legioner ★★★★★
( 20.12.21 15:48:24 MSK )
Последнее исправление: Legioner 20.12.21 15:49:19 MSK (всего исправлений: 2)
Ответ на: комментарий от Anoxemian 20.12.21 15:48:23 MSK
ладно, спасибо за советы, в любом случаи попытаться разобраться стоит
tip4ik32
( 20.12.21 15:49:40 MSK ) автор топика
Ответ на: комментарий от tip4ik32 20.12.21 15:47:18 MSK

Какие такие «файлы» «дергает» эта твоя программа? О каком «скачке» речь?
Zhbert ★★★★★
( 20.12.21 15:49:44 MSK )
Ответ на: комментарий от tip4ik32 20.12.21 15:47:18 MSK
А ещё лучше ищи того, кто писал эту программу и требуй с него исходные файлы.
Legioner ★★★★★
( 20.12.21 15:50:42 MSK )
Ответ на: комментарий от Zhbert 20.12.21 15:49:44 MSK
во время выполнения эксперимента измеряется давление в барах, дальше оно по формулам преобразуется в амперы, в момент взрыва, идет скачек давления и программа зависает, а файлы которые есть в проекте с расширениями .pas, .ini, .dfm, .dcu, .ddp, .dpr, .res.
tip4ik32
( 20.12.21 15:55:26 MSK ) автор топика
Ответ на: комментарий от Legioner 20.12.21 15:50:42 MSK
увы это невозможно, я и сам понимаю что без исходников практически невозможно что либо сделать, но их нету
