Дизассемблер visual studio - IT Справочник
Llscompany.ru

IT Справочник
6 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Дизассемблер visual studio

Дизассемблер visual studio

Answered by:

Question

Answers

Thank you for your update.

Could you please also share a screenshot of your VS 2015 about this?

Does this issue happens for all your projects or just some specific projects? Please go to Tools>Import and Export setting>Reset all settings and back up your current setting, then restore to the default ‘General’ setting to have a try.

MSDN Community Support Please remember to click «Mark as Answer» the responses that resolved your issue, and to click «Unmark as Answer» if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com

  • Marked as answer by Chozla Saturday, September 2, 2017 2:46 AM

All replies

I’m afraid you mentioned something wrong.
Visual Studio Express 2017 does not exist. Do you mean Visual Studio Community 2017?

And I could not find an «expert mode» in my Visual Studio Professional 2015 and 2017.

Could you provide a screenshot in your next post or share it via cloud storage such as OneDrive, Dropbox, etc?

  • Edited by Ashidacchi Wednesday, August 30, 2017 11:16 PM

Welcome to the MSDN forum.

Now there is no VS express 2017 version, please go to Help-About Microsoft Visual Studio to check your VS 2017 version.

Refer to this document: View Disassembly Code in the Visual Studio Debugger and we can know the following message:

  1. This feature is available only if address-level debugging is enabled the Options dialog box, Debugging node. Please go to Tools>Options>Debugging>General and make sure the option ‘Enable address-level debugging’ is checked.
  2. While you are debugging, select Debug > Windows and then click Disassembly.

I tried to debug the C++ project in VS 2017 community/enterprise version and the Disassembly windows can found as below:

Просмотр дизассемблированного кода в VisualStudio

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

Если говорить об управляемом коде, например, коде C#, то есть целых три (!) стадии, где нужно проверять код при его оптимизации:

  1. исходный управляемый код (C#, VB.NET и т.п.);
  2. код CIL, сформированный при компиляции исходного кода (как эту стадию использовать, я показывал ранее);
  3. код ассемблера, сформированный JIT-компилятором из кода CIL при выполнении программы.

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

Сначала в VS создадим новый проект, например, консольное приложение на языке C#.

В файле Program.cs я напишу такой код:

namespace DasmInt
<
class Program
<
static void Main(string[] args)
<
int a = 4;
int b = 8;
int r;
r = a + b;
Console.WriteLine(«a + b = » + r);
Console.ReadLine();
>
>
>

Код просто объявляет три целочисленные переменные и затем складывает значения двух из них и записывает результат в третью. После этого код выводит в консоль результат сложения и ждёт реакции пользователя.

Теперь надо включить дизассемблирование. Для этого в меню выбираем команду Debug/Options или Tools/Options. В открывшемся окне настроек надо перейти в раздел Debugging/General. Затем нужно включить опцию Enable address-level debugging.

Теперь я поставлю точку прерывания (breakpoint) на объявлении первой переменной и запущу код на исполнение под отладчиком.

В момент объявления и инициализации переменной выполнение прервётся.

К этому моменту JIT-компилятор уже создал исполняемый машинный код, и мы можем его дизассемблировать и проверить.

Чтобы увидеть дизассемблированный код, нужно в меню Debug/Windows выбрать пункт Disassembly. Откроется окно с дизассемблированным кодом.

Обратите внимание, что в дизассемблированном коде имеются комментарии, указывающие на соответствующие фрагменты исходного кода. Это сильно упрощает навигацию по коду.

Кроме того, в дизассемблированном коде указана точка прерывания, т.е. строка кода, на котором было приостановлено выполнение программы. Вы можете в процессе отладки проверить выполнение кода ассемблера. Причём справа будет указываться, сколько времени затрачено на выполнение кода с момента прерывания.

Остаётся только напомнить, что код, который выполняется под отладчиком в VS, и код, который формируется JIT-компилятором при выполнении релизной версии, могут иметь существенные различия.

Промежуточный язык CIL

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

Читать еще:  Css focus within

Важнейшие свойства CIL могут быть сформулированы следующим образом:

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

Давайте рассмотрим первые два свойства более подробно:

Поддержка объектной ориентации и интерфейсов

Независимость .NET от языка имеет некоторые практические ограничения. IL неизбежно должен воплощать некоторую определенную методологию программирования, а это означает, что исходный язык также должен быть совместим с этой методологией. Принцип, которым руководствовались в Microsoft при создании IL: классическое объектно-ориентированное программирование с реализацией одиночного наследования классов.

В дополнение к классической объектной ориентации в языке IL также введено понятие интерфейсов, которые впервые были реализованы под Windows с появлением СОМ. Интерфейсы, построенные с использованием .NET — это не то же самое, что интерфейсы СОМ; им не требуется поддержка со стороны инфраструктуры СОМ (так, например, они не наследуются от IUnknown и не имеют ассоциированных глобальных идентификаторов GUID). Однако они разделяют с интерфейсами СОМ идею предоставления контракта, и классы, реализующие заданный интерфейс, должны предлагать реализацию методов и свойств, специфицированных этим интерфейсом.

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

класс, написанный на одном языке, может быть унаследован от класса, реализованного на другом языке

класс может содержать экземпляр другого класса, независимо от того, на каких языках написан каждый из них

объект может напрямую вызывать методы другого объекта, написанного на другом языке

объекты (или ссылки на объекты) могут передаваться между методами

при вызове методов между языками можно шагать в отладчике по вызовам, даже если это означает необходимость перемещения между фрагментами исходного кода, написанными на разных языках

Различие типов значений и типов ссылок

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

В терминах С++ ссылочные типы можно рассматривать, как будто они обращаются к переменным через указатель, в то время как для Visual Basic лучшая аналогия для ссылочных типов — это объекты, обращение к которым в Visual Basic 6 всегда осуществляется по ссылке. В языке IL также установлена своя спецификация относительно хранения данных: экземпляры ссылочных типов всегда хранятся в области памяти, известной как managed heap, в то время как типы значений обычно хранятся в стеке (хотя, если типы значений объявлены как поля внутри ссылочных типов, то они также будут сохранены в managed heap).

Утилита ildasm.exe

Утилита ildasm.exe (Intermediate Language Disassembler — дизассемблер промежуточного языка), которая поставляется в составе пакета .NET Framework 4.0 SDK, позволяет загружать любую сборку .NET и изучать ее содержимое, в том числе ассоциируемый с ней манифест, CIL-код и метаданные типов. По умолчанию эта утилита установлена в каталоге С:Program FilesMicrosoft SDKsWindowsv7.0Abin (если здесь ее нет, поищите на компьютере файл по имени ildasm.exe).

Утилиту ildasm.exe также легко запустить, открыв в Visual Studio 2010 окно Command Prompt (Командная строка), введя в нем слово ildasm и нажав клавишу Enter:

Давайте сначала составим простейшую сборку:

Visual Studio .Net, Framework .Net

Общеязыковая исполнительная среда CLR — динамический компонент каркаса

Наиболее революционным изобретением Framework .Net явилось создание исполнительной среды CLR . С ее появлением процесс написания и выполнения приложений становится принципиально другим. Но обо всем по порядку.

Двухэтапная компиляция. Управляемый модуль и управляемый код

Компиляторы языков программирования, включенные в Visual Studio .Net , создают модули на промежуточном языке MSIL (Microsoft Intermediate Language) , называемом далее просто — IL. Фактически компиляторы создают так называемый управляемый модуль — переносимый исполняемый файл (Portable Executable или PE-файл). Этот файл содержит код на IL и метаданные — всю необходимую информацию как для CLR , так и конечных пользователей, работающих с приложением. О метаданных — важной новинке Framework .Net — мы еще будем говорить неоднократно. В зависимости от выбранного типа проекта, PE-файл может иметь расширения exe, dll, mod или mdl.

Читать еще:  Основные единицы си таблица

Заметьте, PE-файл, имеющий расширение exe, хотя и является exe-файлом, но это не совсем обычный исполняемый Windows файл. При его запуске он распознается как специальный PE-файл и передается CLR для обработки. Исполнительная среда начинает работать с кодом, в котором специфика исходного языка программирования исчезла. Код на IL начинает выполняться под управлением CLR (по этой причине код называется управляемым ). Исполнительную среду можно рассматривать как своеобразную виртуальную IL-машину. Эта машина транслирует «на лету» требуемые для исполнения участки кода в команды реального процессора, который в действительности и выполняет код.

Виртуальная машина

Отделение каркаса от студии явилось естественным шагом. Каркас Framework .Net перестал быть частью студии, а стал надстройкой над операционной системой. Теперь компиляция и создание PE-модулей на IL отделены от выполнения, и эти процессы могут быть реализованы на разных платформах. В состав CLR входят трансляторы JIT (Just In Time Compiler ), которые и выполняют трансляцию IL в командный код той машины, где установлена и функционирует исполнительная среда CLR . Конечно, в первую очередь Microsoft реализовала CLR и FCL для различных версий Windows, включая Windows 98/Me/NT 4/2000, 32 и 64-разрядные версии Windows XP и семейство .Net Server. Для операционных систем Windows CE и Palm разработана облегченная версия Framework .Net .

В 2001 году ECMA (Европейская ассоциация производителей компьютеров) приняла язык программирования C#, CLR и FCL в качестве стандарта, так что Framework .Net уже функционирует на многих платформах, отличных от Windows. Он становится свободно распространяемой виртуальной машиной. Это существенно расширяет сферу его применения. Производители различных компиляторов и сред разработки программных продуктов предпочитают теперь также транслировать свой код в IL, создавая модули в соответствии со спецификациями CLR . Это обеспечивает возможность выполнения их кода на разных платформах.

Microsoft использовала получивший широкое признание опыт виртуальной машины Java, улучшив процесс за счет того, что, в отличие от Java, промежуточный код не интерпретируется исполнительной средой, а компилируется с учетом всех особенностей текущей платформы. Благодаря этому создаются высокопроизводительные приложения.

Следует отметить, что CLR , работая с IL-кодом, выполняет достаточно эффективную оптимизацию и, что не менее важно, защиту кода. Зачастую нецелесообразно выполнять оптимизацию на уровне создания IL-кода — она иногда может не улучшить, а ухудшить ситуацию, не давая CLR провести оптимизацию на нижнем уровне, где можно учесть даже особенности процессора.

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

Если у вас есть готовый PE-файл, то иногда полезно анализировать его IL-код и связанные с ним метаданные . В состав Framework SDK входит дизассемблер — ildasm, выполняющий дизассемблирование PE-файла и показывающий метаданные , а также IL-код с комментариями в наглядной форме. Мы иногда будем пользоваться результатами дизассемблирования. У меня на компьютере кнопка, вызывающая дизассемблер , находится на панели, где собраны наиболее часто используемые мной приложения. Вот путь к папке, в которой обычно находится дизассемблер :

Профессионалы, предпочитающие работать на низком уровне, могут программировать на языке ассемблера IL. В этом случае в их распоряжении будет вся мощь библиотеки FCL и все возможности CLR . У меня на компьютере путь к папке, где находится ассемблер , следующий:

В этом курсе к ассемблеру мы обращаться не будем — я упоминаю о нем для полноты картины.

Метаданные

Переносимый исполняемый PE-файл является самодокументируемым файлом и, как уже говорилось, содержит и код, и метаданные , описывающие код. Файл начинается с манифеста и включает в себя описание всех классов, хранимых в PE-файле, их свойств, методов, всех аргументов этих методов — всю необходимую CLR информацию. Поэтому помимо PE-файла не требуется никаких дополнительных файлов и записей в реестр — вся нужная информация извлекается из самого файла. Среди классов библиотеки FCL имеется класс Reflection , методы которого позволяют извлекать необходимую информацию. Введение метаданных — не только важная техническая часть CLR , но это также часть новой идеологии разработки программных продуктов. Мы увидим, что и на уровне языка C# самодокументированию уделяется большое внимание.

Читать еще:  Система си состоит из

Мы увидим также, что при проектировании класса программист может создавать собственные атрибуты, добавляемые к метаданным PE-файла. Клиенты этого класса могут, используя класс Reflection , получать эту дополнительную информацию, и на ее основании принимать соответствующие решения.

На рис. 1.1 показаны результаты дизассемблирования PE-файла простого консольного приложения с именем Account , включающего три класса: Account , Testing и Class1 . Дизассемблер структурирует информацию, хранимую в метаданных , и показывает ее в типичном формате дерева. Как обычно, это дерево можно сжимать или раскрывать, демонстрируя детали класса. Значки, приписываемые каждому узлу дерева, характеризуют тип узла — класс, свойство, метод, описание. Двойной щелчок кнопки мыши на этом узле позволяет раскрыть его. При раскрытии метода можно получить его код. На рис. 1.1 показан код метода add из класса Account .

Дизассемблер visual studio


Дизассемблеры и декомпиляторы исполняемых файлов

В комментариях к статьям меня часто спрашивают где взять тот или иной инструмент, используемый в исследовании. По возможности я всегда указываю ссылки, но теперь настало время самых мощных инструментов, а именно дизассемблеров и декомпиляторов исполняемых файлов. Сразу уточню терминологию. Дизассемблирование — преобразование программы из двоичного кода к ее ассемблерному представлению. Декомпиляция — процесс воссоздания исходного кода программы.


Скриншот программы dnSpy

Начнем с популярного нынче дотнета. Не будет преувеличением сказать, что самый мощный на сегодняшний день инструмент для потрошения приложений на .NET — это бесплатный проект dnSpy. Он включает в себя декомпилятор C# и Visual Basic .NET, отладчик, редактор сборки с подсветкой синтаксиса, HEX-редактор и еще множество инструментов. Русский язык в наличии. Самую свежую версию можно всегда скачать с офсайта.


Скриншот программы IDA Pro Advanced

IDA Pro (сокращение от Interactive DisAssembler) — один из моих основных инструментов для реверс-инжиниринга и разбора файлов. Это интерактивный дизассемблер и отладчик с поддержкой множества форматов исполняемых файлов для большого числа процессоров и операционных систем. Чтобы перечислить все его возможности потребуется целая книга. Но даже тут возможности IDA не заканчиваются. Плагин Hex-Rays для IDA Pro позволяет декомплировать ассемблерный листинг в более-менее человекопонятный псевдокод, по синтаксису похожий на C. В некоторых случаях это значительно облегчает работу. Просто так приобрести IDA Pro частным лицам практически невозможно, и дело не только в непомерной цене, а в том, что автор придерживается абсолютно неадекватной политики в плане продаж. К счастью, несколько последних версий этого замечательного дизассемблера, несмотря на все трудности, были успешно слиты в свободный доступ. Это IDA Pro Advanced 6.8, последняя доступная версия, которая работает с 32-битными системами, а также IDA Pro Advanced 7.0 и IDA Pro Advanced 7.2 для 64-битных систем. Если по каким-то причинам вы не можете использовать варез, то на офсайте есть бесплатные демо-версии с урезанным функционалом.


Скриншот программы Interactive Delphi Reconstructor

IDR (Interactive Delphi Reconstructor) — бесплатный декомпилятор исполняемых файлов и динамических библиотек. В отличие от IDA Pro, этот декомпилятор создан специально для разбора файлов, написанных на языке Delphi. Сейчас проект прекратил развитие, если какие изменения и вносятся, то исключительно косметические. Исходники для доработки открыты. Лично я пользуюсь стабильным комплектом Interactive Delphi Reconstructor 2.6.0.1.


Скриншот программы VB Decompiler Pro

Еще один специализированный декомпилятор — VB Decompiler Pro. Он работает с программами (EXE, DLL, OCX), написанными на Visual Basic. В случае, если приложение собрано в p-code, декомпилятор может разобрать его практически до исходного кода. Но даже если приложение скомпилировано в native code, в этом случае VB Decompiler анализирует и восстанавливает довольно много инструкций, чтобы насколько это возможно приблизить ассемблерный код к исходному. Это сильно упростит задачу анализа алгоритмов исследуемой программы. Честные граждане могут воспользоваться бесплатной Lite-версией с офсайта, для любителей полных версий софта есть релиз VB Decompiler Pro 10.0. Антивирусы могут ругаться на активатор, но тут вы уже сами решайте что делать.

Конечно, это далеко не полный список инструментов для дизассемблирования и декомпиляции, который есть в свободном доступе. Например, та же набирающая популярность Ghidra от АНБ может составить конкуренцию IDA Pro с Hex-Rays. Но я в этой статье перечислил лишь те программы, которыми пользуюсь сам и которые упоминаются в статьях на этом сайте.

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector