Можно ли декомпилировать отдельный исполняемый файл .Net Core 3?

Я пробовал использовать Dotpeek и ILSpy.Net для декомпиляции (мой собственный код), у них ничего не вышло.

Нужна ли мне особая обфускация для распределенных двоичных файлов автономного одиночного исполняемого файла.Net Core 3?

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <PublishTrimmed>true</PublishTrimmed>
    <PublishReadyToRun>true</PublishReadyToRun>
    <PublishSingleFile>true</PublishSingleFile>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  </PropertyGroup>
</Project>

3 ответа

Решение

Однофайловый exe - действительно неуправляемая оболочка, и ILSpy не поддерживает ее декомпиляцию. Но когда вы запускаете exe, он разворачивает свое содержимое во временную папку. Таким образом, вы можете найти там управляемую dll и декомпилировать ее с помощью ILSpy.

Чтобы найти временную папку, вы можете использовать любой инструмент, который показывает расположение сборок, загруженных процессом. SysInternals Process Monitor (procmon) - хороший инструмент.

Вы можете настроить procmon для фильтрации по вашему имени exe, и когда вы запускаете свой exe, procmon должен отображать некоторые события для сборок, загружаемых из временной папки:

Вы можете перейти в эту папку и найти там свою управляемую dll. И вы можете декомпилировать с помощью ILSpy из этого места.

Я написал запись в блоге: https://eersonmez.blogspot.com/2020/02/ilspy-decompiling-net-core-self.html

Я написал небольшой инструмент dotnet после того, как наткнулся на этот вопрос и сам не смог найти легкий инструмент, кроме ILSpy.

Вы можете установить его с помощью следующей команды dotnet: dotnet tool install -g sfextract.

После установки запустите его, используя следующую команду: sfextract application.exe -o output-dir

Формат пакета для .NET 5.0 (версия пакета 2) идентичен предыдущим версиям. .NET 6.0 (версия пакета 6) имеет дополнительное поле для каждой записи файла, содержащей сжатый размер, поскольку однофайловые приложения теперь могут быть сжаты с помощью gzip, установив EnableCompressionInSingleFile к true.

https://www.nuget.org/packages/sfextract/https://github.com/Droppers/SingleFileExtractor

Я хотел добавить к ответу @Eren Ersönmez, что, хотя ILSpy DotPeek не поддерживает это в то время, поскольку автономный одиночный файл - это просто оболочка, которая содержит все ваши библиотеки DLL и извлекается во время выполнения, просто зная, где он извлеченный в, может спасти вас с помощью ProcMon, ProExp или windbg.

Если вы используете окна, вы можете перейти в c:\Users\{Local Username}\AppData\local\temp\.net\{Имя исполняемого файла}, что должно привести к чему-то похожему на c: \ Users \ alenros \ AppData \ Local \ Temp.net \ MyTestApplication

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

Обновление: в одном из объявлений, сделанных относительно .Net 5, говорится, что способ создания однофайловых исполняемых файлов изменится, поэтому этот метод не будет работать для них.

Другие вопросы по тегам