【问题标题】:Can .Net Core 3 self-contained single executable be decompiled?.Net Core 3 自包含的单个可执行文件可以反编译吗?
【发布时间】:2020-02-02 13:41:01
【问题描述】:

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

我需要对 .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>

【问题讨论】:

  • 自包含的可执行文件基本上是包含必要 DLL 的 zip 文件。 Dotpeek 和 ILSpy 可能还不支持这种格式,但它不是开箱即用的。
  • @ESG 您如何看待 .NET 5?
  • @Jackop 他们改变了可执行文件的构建方式,因此不需要解包,但不知道反编译器是否支持它

标签: .net-core obfuscation decompiling ilspy


【解决方案1】:

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

【讨论】:

  • > 在 .NET Core 3.0 中,您可以编译为单个可执行文件,但该可执行文件实际上是运行时需要执行的所有文件的压缩版本。当您执行该文件时,它首先将自身展开到一个临时目录中,然后从包含所有文件的目录中执行应用程序的入口点。相比之下,.NET 5 将创建一个真正的单可执行文件,可以直接在原地执行。
  • @Jackop 你能给我关于.NET 5 will create a true, single-executable file that can execute directly in place. 的参考资料(文档)吗?
  • ILSpy 7.0(目前为预览版)支持反编译 .NET Core 3 和 .NET 5 包。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    我想补充@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 的公告之一指出,单文件可执行文件的制作方式将发生变化,因此此方法不适用于他们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2017-09-06
      • 2018-10-13
      • 1970-01-01
      • 2018-02-14
      • 2016-06-27
      相关资源
      最近更新 更多