EXE-файлы компилируются с помощью разных языков и технологий, поэтому единого декомпилятора для всех случаев не существует. .NET-приложения (C#, VB.NET, F#) декомпилируются в читаемый исходный код, близкий к оригинальному, тогда как программы на C++ или Rust поддаются лишь частичному восстановлению в виде псевдокода.
Варианты решения:
Как определить тип EXE-файла через Detect It Easy
Detect It Easy (DIE) — бесплатная портативная утилита с русским интерфейсом, которая за несколько секунд определяет компилятор, язык программирования и наличие упаковщиков у любого EXE-файла. Без этой информации легко ошибиться с выбором инструмента: нативное приложение на C++ откроется в dnSpy, но вместо исходного кода там окажется лишь PE-структура файла. Скачайте архив со страницы релизов, распакуйте и запустите die.exe — установка не требуется.
- Перетащите EXE-файл в поле «Имя файла» или нажмите кнопку с иконкой папки справа от него — сканирование запустится автоматически.
- Результаты отображаются в нижней части окна. Ориентируйтесь на строки «Compiler» и «Language»: Microsoft Edge, например, показывает «Microsoft Visual C/C++» и «Language: Rust», то есть является нативным приложением — для его анализа подходит Ghidra из способа 3.
- Учитывайте особенность современных .NET Core-приложений (.NET 5 и новее): их EXE-файл нередко определяется как «Language: C++» с пометкой «Library: .NET Core (Loader)». Это нормально — сам исполняемый файл здесь является нативным загрузчиком среды выполнения, а весь C#-код хранится в DLL-файлах рядом. В таком случае декомпилировать нужно DLL с аналогичным именем из папки программы, а не сам EXE.
Выбирайте инструмент на основе результатов сканирования:
- .NET или .NET Core без пометки Loader — Способы 1 и 2. В результатах указан компилятор Microsoft Visual C# или Basic .NET. Исходный код восстановится в читаемый C# почти полностью.
- Microsoft Visual C/C++, GCC, Rust, Go — Способ 3. Нативная программа: полный исходный код восстановить не получится, только псевдокод на C.
- PyInstaller — Способ 4. Программа собрана из Python-скриптов через PyInstaller — используйте pyinstxtractor.
- Electron, NW.js — Node.js-приложение. Такие программы (Discord, VS Code, Slack) содержат внутри архив
.asarс JavaScript-кодом. Извлеките его утилитойasar extract app.asar ./outиз пакета@electron/asar— код окажется в обычных.js-файлах. - UPX, ASPack, Themida, VMProtect в списке — сначала распакуйте. Файл сжат или защищен, и декомпилятор выдаст нечитаемый результат. UPX-файлы распаковываются командой
upx -d file.exeперед открытием в любом из инструментов. Коммерческие протекторы вроде Themida или VMProtect в большинстве случаев делают декомпиляцию практически невозможной.
Способ 1: dnSpy — для .NET-приложений
dnSpy — наиболее полнофункциональный бесплатный декомпилятор для .NET: помимо восстановления кода на C#, VB.NET и F#, он позволяет отлаживать скомпилированные сборки без исходников, редактировать методы прямо в интерфейсе и сохранять изменения обратно в EXE или DLL. Поддерживаются .NET Framework, .NET Core, .NET 5-9 и Unity-сборки на Mono. Оригинальный репозиторий dnSpy закрыт автором, поэтому скачивать нужно актуальную поддерживаемую ветку — dnSpyEx.
- На странице релизов скачайте архив
dnSpy-net-win64.zip, распакуйте его в удобную папку и запуститеdnSpy.exe— установка не требуется. - Перетащите нужный EXE-файл прямо в панель «Обозреватель сборок» слева или откройте его через меню «Файл» — «Открыть…».
- У корректного .NET-приложения в левой панели развернется дерево пространств имен и классов — кликните по любому методу, чтобы увидеть декомпилированный C#-код справа. Если вместо этого отображается структура PE-файла с разделами вроде «.text», «.data» или «.UPX0» — файл не является .NET-сборкой либо упакован. Наличие секций «.UPX0» и «.UPX1» прямо указывает на UPX-упаковщик: сначала распакуйте файл командой
upx -d file.exe, после чего откройте результат снова. - Для сохранения результата откройте меню «Файл»: пункт «Сохранить код…» сохраняет содержимое текущей открытой сборки, а «Экспорт в проект…» выгружает ее целиком как проект Visual Studio.
- В диалоговом окне «Экспорт в проект» укажите папку назначения в поле «Каталог» — оно обязательно для заполнения и подсвечивается красным, пока пусто. Остальные параметры можно оставить по умолчанию, после чего нажмите «Экспорт».
По умолчанию dnSpy задает формат проекта в стиле VS2010. При открытии результата в Visual Studio 2019 или 2022 отметьте галочку «Использовать формат проекта в SDK стиле» перед экспортом — это позволит избежать проблем совместимости.
- Имена переменных и методов вроде a, b1, c_d. Программа обфусцирована: разработчик намеренно заменил читаемые имена бессмысленными символами. Попробуйте предварительно прогнать файл через деобфускатор de4dot командой
de4dot.exe yourapp.exe, затем откройте очищенный результат в dnSpy. - Часть методов показывает IL-код вместо C#. Эти методы скомпилированы в нативный код через ReadyToRun или NGen — dnSpy не восстанавливает их полностью в C#. Это технологическое ограничение, а не ошибка программы.
- Нужно изменить метод и сохранить правки в файл. Кликните правой кнопкой по нужному методу в дереве, выберите «Редактировать метод (C#)», внесите правки, нажмите «Компилировать», затем сохраните через «Файл» — «Сохранить модуль…».
Способ 2: ILSpy — облегченная альтернатива для .NET
ILSpy декомпилирует .NET-сборки в C# или промежуточный IL-байткод, при этом быстрее запускается и потребляет меньше оперативной памяти по сравнению с dnSpy. Редактирование кода и отладка здесь недоступны, зато есть выбор стандарта языка вывода — от C# 1.0 до актуальной версии, что удобно при анализе старых сборок. Учитывайте, что интерфейс ILSpy полностью на английском языке.
- Распакуйте архив и запустите
ILSpy.exe. В строке меню откройте «File» и выберите «Open…» (Ctrl + O) или перетащите EXE-файл прямо в окно программы. - Загруженная сборка появится в панели «Assemblies» слева. В выпадающем списке в верхней части интерфейса выберите формат вывода: «C#» — чистый исходный код, «IL» — промежуточный байткод, «IL with C#» — оба варианта рядом для сравнения, «ReadyToRun» — для сборок с предварительно скомпилированным нативным кодом.
- Разверните дерево сборки в левой панели, кликая по стрелкам рядом с пространствами имен, чтобы добраться до нужного класса или метода, — декомпилированный код отобразится в правой части окна.
- Чтобы сохранить результат, откройте меню «File» и выберите «Save Code…» (Ctrl + S).
Сообщение «PE file does not contain any managed metadata» в правой панели означает, что открытый файл не является .NET-сборкой — вернитесь к Detect It Easy и проверьте тип файла.
Для .NET Core-приложений (.NET 5 и новее) декомпилировать нужно не EXE, а DLL-файл с аналогичным именем из папки программы: сам исполняемый файл здесь является нативным загрузчиком, и ILSpy выдаст для него ту же ошибку. Откройте папку установленной программы и загрузите файл с расширением .dll вместо .exe.
Способ 3: Ghidra — для анализа нативного кода
Ghidra — бесплатный инструмент для реверс-инжиниринга от Агентства национальной безопасности США, выпущенный в открытый доступ в 2019 году. Программа поддерживает нативные EXE-файлы на C/C++, Go, Rust, Delphi и десятках других языков и платформ. Результатом декомпиляции будет псевдокод, похожий на C, — не оригинальный исходник, а реконструкция логики программы: чем агрессивнее была оптимизация при компиляции, тем сложнее читать вывод. Для работы потребуется Java 21 или новее, интерфейс Ghidra на английском языке.
- Распакуйте архив Ghidra и запустите
ghidraRun.bat. В главном окне откройте меню «File» и выберите «New Project…». - В открывшемся диалоговом окне «New Project» укажите папку для хранения проектных файлов в поле «Project Directory» и введите любое название в поле «Project Name», затем нажмите «Finish».
- После создания проекта снова откройте меню «File» и выберите «Import File…».
- В диалоговом окне импорта Ghidra автоматически определит формат и архитектуру файла — убедитесь, что в поле «Format» стоит «Portable Executable (PE)», после чего нажмите «OK».
- Дважды кликните по импортированному файлу в списке проекта, чтобы открыть его в CodeBrowser. При первом открытии Ghidra предложит выполнить автоматический анализ — нажмите «Yes», оставив настройки по умолчанию. В зависимости от размера файла анализ займет от нескольких секунд до нескольких минут.
- По завершении анализа в левой панели «Symbol Tree» раскройте папку «Functions» и кликните по любой из функций — в правой панели «Decompiler» появится псевдокод. Центральная панель «Listing» показывает дизассемблированный код, а выделение в любой из панелей синхронизируется с остальными автоматически.
Имена функций и переменных в Ghidra генерируются автоматически — вы увидите обозначения вроде FUN_00401000 или DAT_00403020. Их можно переименовывать прямо в интерфейсе: нажмите клавишу L на любом идентификаторе, введите понятное имя, и оно применится во всех панелях сразу.
- Панель Decompiler показывает «No Function». Курсор не находится ни на одной из функций. Раскройте папку «Functions» в панели «Symbol Tree» и кликните по любой из них — псевдокод появится сразу.
- Ghidra не запускается. Проверьте версию Java командой
java -versionв «Командной строке»: нужна версия 21 или новее. Скачайте OpenJDK 21 с сайта Adoptium, если Java не установлена или устарела. - Большинство функций показывают только набор байтов вместо псевдокода. Файл упакован. Для UPX сначала выполните
upx -d file.exeи импортируйте распакованный файл заново.
Способ 4: pyinstxtractor — для Python-приложений
Многие небольшие утилиты распространяются в виде EXE-файлов, собранных из Python-кода через PyInstaller: внутри такого файла находится сжатый Python-интерпретатор и байткод (.pyc), а не машинный код. Detect It Easy при сканировании покажет строку «PyInstaller» в результатах — это сигнал, что нужен данный способ, а не dnSpy или Ghidra.
pyinstxtractor извлекает содержимое PyInstaller-архива в отдельную папку, после чего полученные .pyc-файлы можно декомпилировать обратно в читаемый Python-код с помощью отдельной утилиты. Для работы потребуется установленный Python 3 — желательно той же или близкой версии, которой собирался анализируемый EXE. Версию Python нередко можно определить по метаданным внутри extracted-папки или уточнить в DIE.
- Скачайте файл
pyinstxtractor.pyи поместите его в ту же папку, что и анализируемый EXE-файл. - Откройте «Командную строку» в этой папке и выполните команду:
python pyinstxtractor.py yourapp.exe, заменивyourapp.exeна имя вашего файла. После завершения рядом появится python pyinstxtractor.py yourapp.exeпапкаyourapp.exe_extractedс содержимым архива. - Внутри папки найдите файл с именем, совпадающим с именем EXE, и расширением
.pyc— это байткод главного скрипта. Остальные модули программы находятся в папкеPYZ-00.pyz_extracted. - Для декомпиляции .pyc в читаемый Python-код установите утилиту командой
pip install decompile3, затем выполнитеdecompile3 yourapp.pyc. Чтобы сохранить вывод в файл, добавьте перенаправление:decompile3 yourapp.pyc > output.py. Для файлов, собранных на Python 3.9 и новее, лучше работает pycdc — его готовый бинарник доступен на GitHub.
Декомпиляция .pyc-файлов не всегда дает безупречный результат: часть конструкций может содержать артефакты, требующие ручной правки, — особенно при сложной логике или использовании нестандартных библиотек.
- Ошибка «Magic value in main pyc does not match». Версия Python, которой запускается pyinstxtractor, существенно отличается от той, которой был собран EXE. Попробуйте другую версию Python на вашем компьютере или установите нужную с официального сайта python.org.
- decompile3 выдает ошибку на файлах Python 3.9 и новее. Утилита не поддерживает современные форматы байткода. Скачайте pycdc с GitHub и используйте его вместо decompile3:
pycdc yourapp.pyc. - В папке нет .pyc-файла с именем EXE. Главный скрипт может называться
__main__.pycили иначе — просмотрите содержимое папки и выберите наибольший по размеру .pyc-файл. - Код содержит заглушки функций без тела. Автор применил шифрование байткода или скомпилировал части кода через Cython в нативный код. Полноценно восстановить такую защиту стандартными средствами не получится.
lumpics.ru















































спасибо бро
DotPeek самый лучший вариант.