发布于 2026-01-06 0 阅读
0

I show you how to Crack a .NET Application (3 clicks)

我将教你如何破解.NET应用程序(只需点击3次)

⚠️免责声明: 本文仅供教育和培训之用,我们不对本文提及的技术和解释以及/或提及/提供的工具的误用承担责任,也不对基于本文信息所采取的任何行动承担责任。请将此信息用于合乎道德的目的。


我写这篇文章的原因很简单,在我们办公室(一个联合办公空间)里有很多公司使用 .NET 进行开发,有一天午餐时,我跟他们讲了我们正在做的事情,结果他们完全听不懂,原来他们根本不知道什么是反编译。

他们并不知道,借助一个简单的工具,就可以查看、复制或修改其开发过程——虽然并非所有情况下都应该担心——但对于某些人来说,业务的核心就是开发本身,显然这并没有给他们带来多少好处。

我必须说,这种情况在所有编译型语言中都会发生,但我将重点关注我们精通的 .NET。

在本文中,我将介绍反编译和逆向工程的基本概念,如果您对更复杂的内容感兴趣,请随时向我们咨询!


什么是反编译?

反编译是编译的逆过程(我要为这个绝妙的解释申请专利)。

也就是说,编译过程基本上是:

  • 你编写代码
  • 你按下神奇的编译按钮,它就变成了一个可执行文件/.exe/dll……(好吧,它应该……你肯定漏掉了一个分号之类的东西😪)你还会看到103个警告⚠,但如果你不睁开眼睛,你就看不到它们🤭。

流程大致如下:

编译和应用

反编译则恰恰相反,你有一个可执行文件,.dll,.exe……,然后使用工具(反编译器)你可以得到原始源代码。

反编译

这很简单吗🙄?
我觉得比编译容易,但我们来看看具体是怎么做的。


反编译 .NET / .NET Core 应用程序

让我们反编译一个简单的应用程序:

反编译 .net 应用程序

在这个例子中,我们将使用DnSpy。有很多类似的工具,每个工具都有其特定的优势,但 DnSpy 是反编译和调试 .NET 应用程序的最佳工具之一。

当我们编译 .NET Core 应用程序时,我们将获得编译后的文件,在 .NET Core 中,“.exe”文件是可执行文件,但它负责执行包含我们应用程序代码的“.dll”文件。

好的,接下来我们来反编译这个.dll文件:

反编译 .NET Core

为此,我们只需将其拖到 DnSpy 即可:

dnspy .net core

加载完成后,将显示原始源代码,我们可以对其进行处理、分析、修改、调试等。


查看源代码

应用程序反编译完成后,我们就可以像浏览自己的项目一样浏览源代码:

.NET 源代码


调试应用程序

这将有助于理解其工作原理或获取内存中的一些值。

例如,让我们在执行减法运算之前设置一个断点:

dnspy 断点

然后我们将运行该应用程序:

dnspy debug net core

以下是一个简单的例子:

dnspy 调试

这项功能有时非常有用,但也可能很危险⚡。


修改代码

我们可以毫无问题地修改并重新编译该应用程序:

破解 .NET Core 应用

我们也可以使用 IL 代码来实现,但如果我们不了解 IL 代码,那将会复杂得多。

我们修改了这段简单的文字:

更改 cil 主体 .net core

我们再次编译:

编译 .NET Core

现在,为了保存我们修改后的应用程序,我们将执行以下操作:

保存模块 dnspy

我们将选择文件名、文件路径,并勾选以下选项:

元数据 DNS 间谍

我们将提交修改后的申请:

修改后的.NET Core应用程序

好的,这些只是简单且不重要的例子,至于用这些简单的工具能做什么,就留给你们自己去想象吧💭。

现在我们将看到其他类型的应用程序,因为.NET 中的编译方式相同,无论你使用 c#、vb、ASP、Xamarin、Blazor,一切都以相同的方式工作,那么让我们以 Blazor 应用程序为例来看一下。


使用 Blazor 反编译 Web 应用程序

现在我们已经使用 Blazor 创建了一个示例 Web 应用程序,以下是 Visual Studio 中的应用程序代码:

Blazor .NET Core 应用

它基本上是一个显示天气的应用程序,我们Dotnetsafer在中间添加了内容,以便稍后可以在反编译后的应用程序中看到它,以下是该 Web 应用程序:

Blazor Web应用程序

好的,我们再来获取代码。

首先我们将使用浏览器(哪个浏览器都无所谓),因为在加载 .NET 库来显示应用程序时,它会调用一个方法来获取这些库。

我们必须进入检查模式Ctrl + Shift + C并进入Network该部分,稍后使用Ctrl + F5.

这里是包含我们Web应用程序代码的文件:

.net Blazor 文件

您还可以获取应用程序使用的所有依赖项或您自己的 .net 文件。

我们下载后,用DnSpy再次打开它:

使用 DnSpy 反编译 Blazor

一旦我们有了反编译后的文件,我们就可以执行我在上一点中提到的所有操作。


使用 Xamarin 反编译移动应用

我们稍微提高了难度级别🧨,但操作方式仍然相同。

我们使用 Xamarin 创建了一个简单的移动设备应用程序,编译后的应用程序将具有 .APK 扩展名。

首先,我们要做的就是解压缩 APK 文件。虽然有一些工具可以做到这一点,但并非必要。对于如此简单的操作,我们可以使用WinRAR(没错,就是那个永不过期的免费软件🆓):

反编译 apk

我们将复制文件夹中的所有文件:

反编译 Xamarin APK

文件夹内Assemblies包含所有.NET文件:

.net xamarin 文件

有趣的是,这些文件使用了lz4压缩,如果我们尝试用DnSpy反编译它们,就会出错:

dnspy 反编译 Xamarin 文件时出错

为此,我提供了一个简单的解决方案,一个小型 Python 脚本,它可以帮助我们将所有 .NET .dll 文件解压缩。

是的,这听起来非常复杂,看来你必须是这方面的专家才行:

.net 黑客攻击

但这其实是一件非常简单的事情,我们不到一分钟就能完成。


解压缩 Xamarin .NET 库

如果你的电脑上没有安装 Python,请先安装它

安装好 Python 之后(我是在VSCode终端运行的),我们继续:

安装 lz4:

https://dev-to-uploads.s3.amazonaws.com/i/ua8pyhcf6ard0h1dx2pl.png

python -m pip install lz4或者简单地pip install lz4

使用解压缩脚本



import lz4.block
import sys
import struct
import os

def print_usage_and_exit():
    sys.exit("usage: py .\\decompressor.py target_path")

cwd = os.path.abspath(os.getcwd())

def decompress(filePath):
    input_filepath = filePath
    output_path = os.path.join("extracted", "");

    if(not os.path.exists(output_path)):
        os.mkdir(output_path)

    output_filepath = os.path.join(output_path, os.path.basename(filePath))
    header_expected_magic = b'XALZ'

    with open(input_filepath, "rb") as xalz_file:
        data = xalz_file.read()

        if data[:4] != header_expected_magic:
            sys.exit("The input file does not contain the expected magic bytes, aborting ...")

        header_index = data[4:8]
        header_uncompressed_length = struct.unpack('<I', data[8:12])[0]
        payload = data[12:]

        print("header index: %s" % header_index)
        print("compressed payload size: %s bytes" % len(payload))
        print("uncompressed length according to header: %s bytes" % header_uncompressed_length)

        decompressed = lz4.block.decompress(payload, uncompressed_size=header_uncompressed_length)

        with open(output_filepath, "wb") as output_file:
            output_file.write(decompressed)
            output_file.close()
        print("result written to file")

if __name__ == "__main__":
    n = 0
    for file in os.listdir(cwd):
        try:
            if(file.endswith(".dll")):
                decompress(file)
                n += 1;
        except:
            print("failed to decompress " + os.path.basename(file))

    print("\\nDecompressed ", n, " assemblies!")



Enter fullscreen mode Exit fullscreen mode

该脚本的作者是 Christian Reitter,X41 D-Sec GmbH,感谢您在X41 D-Sec GmbH上发表的文章,我们对其进行了修改,使其能够解压缩目录中的所有文件。

我们将把代码复制到一个名为 的文件中decompress.py,并将其保存在与 .dll 文件相同的路径中。


解压缩所需文件:

解压缩 .net xamarin 文件

我们将使用py .\decompressor.py .\它来解压缩目录中的所有 .dll 文件。

在这种情况下,我只对与我的应用程序对应的两个文件感兴趣。

有什么事不难呢?

破解 Xamarin

现在我们已经准备好使用 DnSpy 打开这些文件了:

使用 dnspy 反编译 Xamarin 文件

现在我们可以再次执行我之前提到的所有操作,步骤始终相同,只是文件的编译方式有所不同。

这适用于所有基于 .NET 的应用程序,例如使用 C# 在 Unity 中开发的游戏、虚拟现实应用程序和增强现实应用程序。

你喜欢这篇文章吗?

虽然很简单,但我认为作为入门级课程来说已经足够了,可以学到一些相关知识😊。

如果您觉得有趣,请毫不犹豫地支持我们,并在下方留言👇告诉我们您是否还想了解其他内容,例如破解注入和其他方面。

我们可以进行一些有趣的练习,或者做任何你想在这里看到的事情。

感谢您阅读本文❤,请记住,ByteHide 将会上传有关 .NET 安全性的文章🛡。

谢谢大家的关注,希望你们学到了很多!

再见

文章来源:https://dev.to/bytehide/i-show-you-how-to-crack-a-net-application-3-clicks-47ke