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

3 回答 3

8

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

于 2020-02-27T10:54:06.913 回答
1

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

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

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

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

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

于 2021-09-10T18:41:42.060 回答
0

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

于 2020-05-19T12:19:34.050 回答