65.9K
CodeProject 正在变化。 阅读更多。
Home

如何轻松免费保护你的 .NET 代码

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (58投票s)

2016 年 8 月 3 日

CPOL

12分钟阅读

viewsIcon

87706

了解如何轻松免费保护你的 .NET 代码(无论是使用 WinForms、WPF、ASP.NET 还是 Silverlight 编写)!

引言

最近,我正在使用 ASP.NET 和 C# 开发一个学校管理系统。该软件将被打包到一个安装程序中(包含 MSSQL Server Express 数据库引擎和 .NET Framework 等先决条件),该安装程序将在安装后自动部署软件到客户端计算机并配置 IIS。我很难找到一个能够满足此需求的产品;但最终,我找到了。所以,我准备好了应用程序的核心,有了安装程序构建器,并规划了一个计划,通过我将部署到外部服务器的 WCF 服务来处理许可证注册,然后……砰!

我突然意识到——市面上有各种各样的 .NET Reflector(可以反编译 .NET 代码并浏览其中类的程序),我知道我需要一种方法来隐藏我的源代码,如果我想阻止海盗窥视它的话。我时间紧迫(别笑),我急需用钱,所以,我真的很想要一个自动化的解决方案,不需要我编写任何代码来实现这一点——我已经为我的应用程序编码了好几个月,不想花更多时间去调整或编写更多代码来保护它的源代码。

我很快列出了一份我选择的工具的要求清单

  1. 我的首要要求是工具必须免费——是的,免费。我没钱花在任何商业产品上。所以,我想要免费的!
  1. 其次,该工具必须极其易于使用;在最短的时间内为我的代码提供最大的保护——基本上,在 5 分钟或更短的时间内。
  1. 最后,如果该工具是一个开源项目,我想要一个正在积极开发的。

带着上述清单,我开始在搜索引擎上查询。令我惊喜的是,在网上进行了广泛搜索后,我找到了我想要的工具。

现在,在这篇文章中,我将向你展示如何使用我找到的工具来完全保护你的 .NET 代码,即使是像 Red Gate 的 Reflector 这样的工具也无法理解你的代码。我的讨论将在 ASP.NET 网站的上下文中进行,但你可以将我在这里提出的想法应用于你的 Windows Forms、WPF,甚至你的 Silverlight Out-Of-Browser (OOB) 应用程序项目。

那么,让我们开始吧。

首先——我找到的工具

我知道你已经迫不及待想知道是什么了。所以,这里是我找到的工具,当然,也是我们将要使用的工具

  1. ILSpy——ILSpy 是一个强大、免费且正在积极开发的开源项目。它是一个 .NET 类浏览器和反编译器。这不是我们将用于保护代码的工具,但我们将使用它来反编译我们编译的 .NET 代码,然后浏览源代码,以便让我们 glimpse 到当源代码未受保护时,反向工程师或海盗可以多么容易地访问我们的源代码。我们将使用此工具,在保护代码之前和之后,这样你就可以看到受保护和未受保护代码之间的区别。

    你可以从以下 URL 下载 ILSpy:http://ilspy.net

  1. ConfuserEx——没错!ConfuserEx 是我们将用于保护我们代码的工具。它也是一个免费的开源项目。该项目最新版本发布于 2016 年 7 月 1 日。尽管该工具的开发者几天前刚刚表示他将不再发布该产品的新版本,但他还清楚地表示他并没有完全放弃该项目。他可能会偶尔发布应用程序的修复程序,但不会进行任何重大更改。话虽如此,开发者鼓励有兴趣将项目进一步发展的人这样做。所以,如果你觉得有能力,可以试试!

这是 ConfuserEx 在 github 上的下载链接:https://github.com/yck1509/ConfuserEx/releases

ILSpy 和 ConfuserEx 都不需要安装——这意味着它们是便携式应用程序。只需下载它们各自的 zip 文件,然后解压到硬盘上所需的任何位置。浏览硬盘上解压文件的位置,然后双击相应的文件即可启动程序。

对于 ILSpy,启动程序所需的文件在下面的图片中高亮显示

对于 ConfuserEx,目标文件在下面的图片中高亮显示

开始过程

创建和发布我们的网站

好了!既然我们已经准备好了所需的工具,现在是时候准备好我们的示例网站以进行保护了。请按照以下步骤操作

步骤 1:继续创建一个新的 ASP.NET 网站。

步骤 2:在 Default.aspx 页面上添加一个标签,并将其 ID 设置为“mylabel”。

步骤 3:在 Default.aspx 代码隐藏文件的 Page_Load 方法中,使用你选择的编程语言输入以下代码——我使用的是 C#。

mylable.Text="Welcome To Code-Disguise Camp, dude!";

这只是一个演示应用程序,所以我们可以将代码直接放在网页的代码隐藏文件中。但在实际应用中,我们会将大部分代码提取到同一项目中的独立类中,或者提取到一个单独的类库项目中。然后,我们将在主网站项目中引用并使用该库——这有利于良好的应用程序设计,促进代码重用,也使 .NET 代码的保护更加直接。

步骤 4:现在,我们将通过右键单击我们的网站项目(在 Visual Studio 的解决方案资源管理器中,我假设你也和我一样使用 Visual Studio),然后从上下文菜单中选择“发布网站”来发布我们的网站。

步骤 5:在出现的“发布网站”对话框中,选择在对话框右侧窗格中创建“自定义”发布配置文件。为配置文件输入任意名称。

参见下图

步骤 6:移至“发布网站”对话框左侧窗格中的“连接”选项卡,然后从“发布方法”下拉列表中选择“文件系统”选项——我们选择此选项是因为我们将把网站发布到本地计算机上的目录/文件夹。

同时,选择一个系统上的位置,你希望在那里发布你的网站。你可以通过单击显示在文本框右侧的带有省略号的按钮来实现,该文本框在你选择“文件系统”发布方法后立即出现。

别现在放弃我。要坚持下去!继续下一步。

步骤 7:从“发布网站”对话框的左侧窗格中选择“设置”选项卡。向右展开“文件发布选项”部分,然后勾选“发布时预编译”复选框。同时,点击此选项旁边的“配置”链接,以显示“高级预编译设置”对话框,如下图所示

在“高级预编译设置”对话框(如下图所示)中,选择“将所有页面和控件输出合并到一个程序集中”选项。输入你选择的任意名称(我输入了“Trial”),用作创建的程序集。

注意:如果你不选择将所有页面和控件输出合并到一个程序集中的选项,ASP.NET 将编译你网站所有页面代码隐藏文件中的代码,并为每个页面生成单独的程序集。如果你在这些代码隐藏文件中放入了一些敏感代码(本不应该如此),你将需要通过本文代码保护部分概述的步骤来保护每个程序集——取决于你的整个网站中有多少页面,这个过程可能不会很有趣!

点击“确定”按钮

好了!我们在第 7 步中所做的是指示 ASP.NET 在发布网站到我们在本地计算机上指定的目录之前对其进行编译。此步骤还会创建一个名为我们在“高级预编译设置”对话框中指定的程序集的单个程序集(.dll 文件)。

如果我们有外部类中的代码(除了我们在代码隐藏文件中编写的代码),这些类将(由 ASP.NET 自动)添加到“App_Code”文件夹中,该文件夹的所有内容也将被编译成一个单独的“App_Code.dll”程序集——通常,这个程序集也应该是保护的目标。

步骤 8:点击“发布”按钮,发布网站。

最后一步是将我们的网站发布到目标目录。

透过海盗的眼睛看我们的代码

好的,现在我们已经发布了我们的网站,并且(在此过程中)预编译生成了代码的锁定形式——一个程序集。一切都很好;至少,直到你发现使用像 ILSpy 这样的精妙工具,海盗能够轻松获取你的源代码。

要感受我在说什么,请执行以下操作

  • 启动 ILSpy,然后从“文件”菜单中选择“打开”。
  • 导航到我们发布网站的目录,然后双击我们在发布过程中创建的程序集的名称,以打开它。
  • 在左侧窗格中,展开我们程序集的最顶层节点
  • 同时,展开一个内部节点以显示“_Default”类,如下图所示

你看到了什么?

我们的代码,就摆在那里——赤裸裸的!

...

所以……我们现在该怎么办?

很简单——我们开战!

用 ConfuserEx 让敌人陷入混乱

我们将使用 ConfuserEx 来让敌人陷入混乱。继续启动 ConfuserEx,然后按照以下步骤操作

步骤 1:点击右侧的加号,然后导航到我们在发布过程中创建的程序集。双击该文件,在 ConfuserEx 中打开它,如下图所示

步骤 2:点击“设置”选项卡。在“模块”窗格中,选择我们的程序集。在右侧,点击“+”按钮——这将在“规则”窗格中添加一个新规则(“true”)。

步骤 3:点击“编辑规则”按钮(也就是上面图片中高亮显示的“-”按钮下方的按钮)来编辑我们刚刚添加的规则。这将打开“编辑规则”对话框

ConfuserEx 提供 5 种不同的保护级别,其中一种可以在(代码保护期间)从“预设”下拉列表中选择。

在我们的演练中,我们将使用“激进”保护级别——所以,请从“预设”下拉列表中选择它。

在“预设”列表下方,你会找到“保护”窗格。ConfuserEx 为我们的代码提供了多达 10 种不同的保护类型,包括

  • 反 IL 反编译保护(anti ildasm)
  • 反篡改保护(anti tamper)
  • 常量保护(constants)
  • 控制流保护(ctrl flow)
  • 反转储保护(anti dump)
  • 反调试保护(anti debug)
  • 无效元数据保护(invalid metadata)
  • 引用代理保护(ref proxy)
  • 资源保护(resources)
  • 名称保护(rename)

我们将对我们的代码应用所有 10 种保护,以实现最大程度的保护——记住,我告诉过你我们要开战了!

要添加第一种类型的保护,请点击(右侧的)“+”按钮——这将添加“anti ildasm”保护。

再次点击“+”按钮,添加第二种保护类型;但这次,从下拉列表中选择下一个保护类型。

重复此过程以添加所有 10 种保护。你的屏幕应该像下图所示

点击“完成”按钮,然后继续下一步。

本质上,我们对 ConfuserEx 所做的陈述(在添加“true”规则和编辑规则以定义我们的保护级别和保护类型之间)是这样的

“是(true)。对我们刚刚选择的程序集应用‘激进’保护(使用指定的 10 种保护类型)”。

步骤 4:点击“保护!”选项卡。在此选项卡右侧,点击“保护!”按钮。如果一切顺利(并且应该如此,如果你一直仔细按照我的指示操作),你的屏幕应该看起来像这样

瞧!

我们的代码已完全受保护。

ConfuserEx 的绝妙之处在于,它不会篡改你原来的程序集。它只是复制一份你的程序集,保护该副本,然后将其保存在一个标记为“Confused”的文件夹中——你会在发布网站的“bin”目录/文件夹中找到这个文件夹。

然后,你可以在生产环境/服务器中使用生成的(Confused)程序集来替代原始程序集。

为了向你展示 ConfuserEx 为我们做了多少工作,请按照之前的步骤操作,在 ILSpy 中打开你的被混淆的程序集。再次尝试找到“_Default”类。

你现在看到了什么?

惊掉下巴!

这就是 ConfuserEx 的力量

你应该知道的事情

我认为在此(此时)说明 ConfuserEx 通过使用不同的算法来操作你的源代码来保护它很重要。因此,你可能会注意到在保护应用程序后运行应用程序时,性能会略有延迟。在我看来,性能上的延迟微不足道;与我获得的源代码保护级别相比,我认为它微不足道。

结论

正如我之前所说,你可以使用这些工具来保护你使用其他 .NET API 编写的 .NET 代码,例如 Win Forms、WPF 和 Silverlight。为了使使用这些技术进行保护更加直接,你应该将你的业务逻辑从应用程序的代码隐藏文件中移出,并(最好)移到一个单独的类库项目中,你可以不断修改、构建并引用到你的主项目中。当你完成开发后,你就可以保护你的库,然后再将你的整个应用程序打包到安装程序中。

所以,就这样了……轻松完成你的 .NET 代码的完整保护!

哦……万一你在想(在本文开头提到的)帮助我将我的 asp.net 应用程序打包成安装程序,并包含 MSSQL Server Express 数据库引擎和 .NET Framework 作为先决条件,同时自动安装和配置最终用户计算机上的 IIS 的工具——这个工具叫做“Advanced Installer”。

而且,猜猜怎么着——如果你是 Microsoft MVP 或 Microsoft Certified Trainer (MCT),或者你只是在一个开源项目上工作,你可以从以下 URL 获取一份免费的 Advanced Installer:http://www.advancedinstaller.com/free-license.html

那么,我现在还能说什么呢?祝你代码保护愉快!

© . All rights reserved.