Как дизассемблировать c# приложение
Используя ReflectionDisassembler, можно получить IL код приложения. Можно ли получить c# код приложения, без использования сторонних библиотек?
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 4 июл 2021 в 20:25
11 1 1 бронзовый знак
Что вы понимаете под «без использования сторонних библиотек»? Вам нужно получить исходный код с помощью самописного приложения на C#? Если да — бог в помощь. Если нет — ILSpy в помощь
4 июл 2021 в 20:31
github.com/dnSpy/dnSpy изучаете код, пишете свой собственный по образу и подобию.
4 июл 2021 в 20:34
если установлен .NET Framework, то можно использовать ildasm.exe .
5 июл 2021 в 6:44
0
Сортировка: Сброс на вариант по умолчанию
Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.
- c#
- .net
- dotnet-cli
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как дизассемблировать
Дизассемблеры и декомпиляторы исполняемых файлов
В комментариях к статьям меня часто спрашивают где взять тот или иной инструмент, используемый в исследовании. По возможности я всегда указываю ссылки, но теперь настало время самых мощных инструментов, а именно дизассемблеров и декомпиляторов исполняемых файлов. Сразу уточню терминологию. Дизассемблирование — преобразование программы из двоичного кода к ее ассемблерному представлению. Декомпиляция — процесс воссоздания исходного кода программы.

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

Скриншот программы Relyze
Relyze — бесплатный интерактивный дизассемблер для исполняемых файлов в формате x86, x64, ARM32 и ARM64. Поддерживает многие фичи, присущие IDA, такие как декомпиляция двоичного кода в C-подобный псевдокод или построение графов. Кроме этого имеет и уникальные для дизассемблера функции, такие как сравнение двух файлов, поддержка плагинов на Ruby. Лично для меня особой ценностью является Data Type Manager, который показывает структуры и интерфейсы, использованные в исследуемой программе, и не просто как факт их наличия, а с описанием их полей, параметров вызова, смещениями в структуре и размером каждого поля. Скачать дистрибутив нужной разрядности можно с офсайта.

Скриншот программы 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. Но я в этой статье перечислил лишь те программы, которыми пользуюсь сам и которые упоминаются в статьях на этом сайте.
Дизассемблируем циклы, написанные на Си
Сегодня мы будем смотреть дизассемблированный код инструкций if, for, while, switch , которые написаны на языке Си.

Инcтрукция if
Данную инструкцию довольно просто отличить в дизассемблированном виде от других инструкций. Её отличительное свойство — одиночные инструкции условного перехода je, jne и другие команды jump.


Напишем небольшую программу на языке Си и дизассемблируем её с помощью radare2. Разницы между IDA PRO и radare2 при дизассемблировании этих программ не было обнаружено, поэтому я воспользуюсь radare2. Вы можете использовать IDA PRO.
IDA PRO


radare2

Код на Си
#include void main() < int x = 1; int y = 2; if(x == y) < printf("x = y\n"); >else < printf("x != y\n"); >>
Компилируем при помощи gcc. Команда gcc -m32 prog_if.c -o prog_if . -m32 означает, что компилироваться код будет под архитектуру x86.
Чтобы посмотреть на код в radare2, напишем команду r2 prog_if . Далее прописываем aaa для анализа кода и переходим к функции main s main . Посмотрим на код с помощью команды pdf .
Дизассемблированный вариант в radare2

Первым делом в программе происходит объявление переменных ( int x; int y ), а затем значение 1 перемещается в var_ch (это переменная x) и значение 2 в var10h (это переменная y). Далее идёт сравнение (cmp) 1 и 2 ( cmp edx, dword [var_10h] ). Эти значения не равны. Значит jne ( jump if not equal) перейдёт по адресу 0x000011e1. Проще всего инструкцию if запомнить и определить в режиме графов (команда VV для для radare2 или клавиша пробел для IDA).
Режим графов

Немного усложним задачу. Добавим вложенные инструкции. Попробуйте проанализировать этот код.
Код на Си
#include void main() < int x = 0; int y = 1; int z = 2; if(x == y) < if(z == 0) < printf("z = 0; x = y\n"); >else < printf("z = 0; x != y\n"); >> else < if(z == 0) < printf("z = zero and x != y.\n"); >else < printf("z non-zero and x != y.\n"); >> >
Дизассемблированный вариант в radare2

Режим графов

В режиме графов это воспринимать намного проще.
Инструкция for
Циклы for всегда состоят из четырех этапов: инициализации, сравнения, выполнения инструкций и инкремента/декремента. По этим этапам мы будем отличать цикл for в ассемблерном коде от других.
Код на Си
#include void main() < int x; for(x = 0; x < 100; x++) < printf("x = %d", x); >>
Дизассемблированный вариант в radare2

1 — инициализации переменной var_ch (x = 0)
2 — сравнение, а затем jle. ( пока x не будет меньше или равен 2, выполнять цикл.)
3 — выполнения инструкций (printf)
4 — инкремент переменной var_ch (++x)
Режим графов

Инструкция while
Цикл while часто используется при ожидании, пока не будет выполнено какое-то условие, например получение команды или пакета. В ассемблере циклы while похожи на for, но их легче понять. В ассемблере это выражение похоже на цикл for, но инкремента может и не быть.
Код на Си
#include int func_1(int x); int change_status(); int main() < int status = 0; while(status == 0) < printf("int e = %d", func_1(5) ); status = change_status(); >return 0; > int change_status() < return 1; >int func_1(int x) < int c; int e; int l; c = 1 + 2; e = x / 5; l = 4 - 2; return e; >
Дизассемблированный вариант в radare2

1 — инициализации переменной var_4h (status = 0)
2 — сравнение, а затем je. ( пока x равен 0, выполнять цикл.)
3 — выполнения инструкций (func1, printf, change_status)
Режим графов

Инструкция switch
Конструкция switch обычно компилируется двумя способами: по примеру условного выражения или как таблица переходов.
Компиляция по примеру условного выражения
Код на Си
#include int main() < int i = 3; switch(i) < case 1: printf("CASE_1 i = %d", i+4); break; case 2: printf("CASE_2 i = %d", i+9); break; case 3: printf("CASE_3 i = %d", i+14); break; >return 0; >
Дизассемблированный вариант в radare2

1 — инициализации переменной var_4h (i = 3)
2 — выполнения инструкций (add, printf)
Чтобы понять какой «case» выбран, происходит сравнение (cmp, а затем je, jne) переменной i с значением case.
Режим графов



Глядя на этот код, сложно (если вообще возможно) сказать, что представлял собой оригинальный исходный текст — конструкцию switch или последовательность выражений if . В обоих случаях код выглядит одинаково, поскольку оба выражения используют множество инструкций cmp и je или jne.
Таблица переходов
Следующий пример ассемблерного кода часто можно встретить в больших смежных выражениях switch. Мы добавим case 4 и инструкцию по умолчанию.
Код на Си
#include int main() < int i = 3; switch(i) < case 1: printf("CASE_1 i = %d", i+4); break; case 2: printf("CASE_2 i = %d", i+9); break; case 3: printf("CASE_3 i = %d", i+14); break; case 4: printf("CASE_3 i = %d", i+19); break; default: break; >return 0; >
Дизассемблированный вариант в radare2


1 — инициализации переменной var_4h (i = 3)
2 — выполнения инструкций (add, printf)
Вот этот дизасcемблированный код довольно сложно быстро отличить от if и вообще понять что и как тут. В режиме графов всё будет более понятно.
Режим графов




Режим графов — ваш друг в дизасcемблировании 🙂
На этом всё. Рекомендую попробовать самому написать программы на Си, скомпилировать и изучить дизасcемблированный код. Практика и ещё раз практика!
Спасибо за внимание. Не болейте.
- ассемблер
- radare2
- assembler
- reverse-engineering
- реверс-инжиниринг
- циклы
- отладка
- информационная безопасность
Как дизассемблировать программу?
Уважаемые форумчане, подскажите мне пожалуйста как добраться до исходного кода, exe файла. Учитель задал эту задачу будучи не вдаваясь в подробности, (единственное что он показал как его дизассемблером пропустить, но что то у меня перестало это получатся) суть самому найти ответ, но я застрял. Если бы меня кто то подтолкнул? Буду рад любым вашим советам.
Вложения
| Project20.rar (167.0 Кб, 6 просмотров) |
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как дизассемблировать DOS СОМ программу
Здравствуйте, Не подскажите мне пожалуйста, Как я смогу узнать код ассемблера (( Я хочу изучить.
Как дизассемблировать файл
Как дисассемблировать файл не подскажете.
Как дизассемблировать в windows xp?
Как дизассемблировать в windows xp.
Подскажите, как правильно дизассемблировать прошивку?
Доброго времени суток всем. Сразу же оговорюсь, что в деле программирования для микроконтроллеров.
![]()
8376 / 4259 / 1617
Регистрация: 01.02.2015
Сообщений: 13,252
Записей в блоге: 5
MerlinCheater, судя по всему, это программа создана на языке высокого уровня — C или Delphi.
Если нет ни опыта ни желания — восстановить исходник не получится.
Также, были случаи злоупотребления
Пояснение строчек кода
Поэтому поясните происхождение файла, причины, побудившие преподавателя дать такое задание человеку с гуманитарной специальностью.
Добавлю от себя. Задачи подобного рода — большая редкость и всегда вызывают вопросы о целесообразности помощи.
Регистрация: 23.11.2019
Сообщений: 5
Насчет того, что побуждает учителей что либо делать мне не ведомо, я же не учитель. Ну а насчет опыта, ну его мало потому я и учусь. Желание конечно есть, я уже все что мог попробывал, и различные программы и прочее не получилось. Что еще добавить?
Эксперт Hardware
![]()
5726 / 2196 / 381
Регистрация: 29.07.2014
Сообщений: 3,024
Записей в блоге: 4
Сообщение от MerlinCheater 
я уже все что мог попробывал, и различные программы и прочее не получилось. Что еще добавить?
что именно не получается, и о каких программах идёт речь?
530 / 179 / 38
Регистрация: 18.08.2012
Сообщений: 886
Программа написана на Delphi 7
Основное и единственное действие происходит в
00452D34 TForm1_FormCreate proc near
Основной функционал — это trial
Добавлено через 11 минут
Остаётся только повторить:
я — крайне сомневаюсь, что в универах дают задания по взлому/реверсу/декомпиляции программ, особенно если они на Delphi или с использованием MFC — т.к. для новичка (да и для самого препода) — это очень трудно, если вообще возможно для них.
Так что. автор — не мутите воду — вы форумом ошиблись. Вам бы на exelab с таким. Там это любят.
