.Net Core 3 自包含的单个可执行文件可以反编译吗?

Can .Net Core 3 self-contained single executable be decompiled?

我尝试使用 Dotpeek 和 ILSpy.Net 反编译(我自己的代码),他们失败了。

Do I need special obfuscation on distributed binaries of .Net Core 3 self-contained single executable ?

<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>

单文件 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

我想补充@Eren Ersönmez 的回答,虽然 ILSpy DotPeek 当时不支持这个,因为独立的单个文件只是一个包含所有 DLL 并在运行时提取的包装器,只要知道它被提取到哪里就可以节省您使用 ProcMon 或 ProExp 或 windbg 的时间。

如果你使用 windows 你可以去 c:\Users\{Local Username}\AppData\local\temp\.net\{Name of executable} 这应该导致类似的地方 c:\Users\alenros\AppData\Local\Temp.net\MyTestApplication

启动您的 exe,将在该位置创建一个同名文件夹。 该文件夹将包含随机命名的文件夹。打开最新的一个,在那里你会找到所有提取的DLL,然后可以反编译。

更新:关于 .Net 5 的公告之一声明单文件可执行文件的制作方式将会改变,因此此方法不适用于它们。

偶然发现这个问题后,我写了一个小的 dotnet 工具,除了 ILSpy 自己找不到轻量级的工具。

您可以使用以下 dotnet 命令安装它:dotnet tool install -g sfextract.

安装后,运行 使用以下命令:sfextract application.exe -o output-dir

.NET 5.0 的包格式(包版本 2)与以前的版本相同。 .NET 6.0(捆绑版本 6)为包含压缩大小的每个文件条目增加了一个字段,因为现在可以通过将 EnableCompressionInSingleFile 设置为 true.[=16= 来使用 gzip 压缩单文件应用程序]

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