CSharp - 保护.Net代码防止逆向工程?

  显示原文与译文双语对照的内容

混淆是一种方式,但它不能保护应用程序的盗版保护安全。 如何确保应用程序没有被篡改,以及如何确保注册机制不能被反向工程?

也可以将 C# 应用程序转换为本机代码,Xenocode 太昂贵。

C# 提供了很多特性,并且是我的代码的理想语言,所以在 C++ 中重新编写整个代码库是不可能的。

可以轻松地从. NET. 中的签名程序集中删除安全证书

时间:

你不能。

在本地机器上是可以采取一些步骤来使它成为一个有任何 executable. 小更加困难,但是最终 最终,代码必须转换为本机代码,并且每个运行的应用程序都是脆弱的。

你要做的只是让它变得很难,让它不值得人们的麻烦。

我有一些建议可以帮助你保护你的应用程序:

  • 为你的代码提供的模糊处理。Dotfuscator 有一个免费版,并带有 Visual Studio 。
  • 使用公钥/私钥或者非对称加密生成产品许可证。 这就确保只有你的可以生成你的许可证代码。 即使你的应用程序有裂纹,你也可以确保它们不会为你的应用程序释放密钥生成器,因为不可能反向生成生成算法。
  • 第三方封隔器用于打包你的.NET 到加密的Win32包装应用程序可执行文件。 Themida 是一个更好的。 于reversing,这会阻止相关人又反射应用程序中以 .NET 反射器 。并且将其设为疼痛到 unpack.
  • 编写自己的自定义包装机 。 如果第三方包装机太贵,考虑编写自己的。 有时定制包装器可能非常有效,因为没有良好的方法来解压它们。 教程 如何编写自己的包装机 提供了编写自己的Win32包装机的大量信息。

最终,如果人们希望你的应用程序被破解,他们将。 看看所有的商业软件都有大量的资源来保护它们的应用程序,但是在应用程序发布到公众面前之前它们已经被破解了。

熟练的反向工程师可以启动 IDA-Pro,并像黄油一样通过你的应用程序切片,无论你做什么。 打包的应用程序可以被解包,混淆只会阻止它在公园中漫游。 你的复杂许可证代码的所有努力都可以用一个字节补丁来撤销。

你只需要承认有一个很有机会的人会盗版你的软件。 也有一些人无论什么谁从不是否准备付费购买你的应用,这些都是你不需要担心的人。

然而,许多企业在强力攻击会不错过任何风险有一个诉讼而愉快购买软件许可证和许多电脑用户谁或者不想冒险,那就找错甚至也不懂技术的足以获得盗版。 这些是你真正的客户,你应该集中精力为他们提供一个良好的用户体验,并忽略那些破解你的软件的人。

我以前的申请是盗版的,我把它当作个人的侮辱。 在这里,我是一个small-time开发者,把我的心灵和灵魂倾注在一个应用程序中,这些人从我那里 gall? ! 他们直接从我的口袋里拿钱 !

我立即添加了一堆严格的DRM代码,并试图破坏任何使用非法或者破解副本的人。 我当然应该努力使我的应用程序更好,而不是试图停止。 真正在,不仅如此,但我是意图削弱我的客户将所有这些额外的保护措施我当时 putting.

经过一场漫长的战斗,我意识到我在抗击潮汐,所有这些时间都浪费了。 我取出了所有的phone-home代码,除了barebones的许可函数,而且从未回头。

你不能完全保护任何应用程序( 管理或非托管) 。 如果像Playstation和iPad这样的系统能得到破解的—,厂商甚至可以控制硬件 —,你的应用有什么希望? 幸运的是,你并不想。 在我看来,你需要保护你的应用程序只是足以让有些人无法意外盗版你的产品,没有别的了。

例如如果你使用的是per-machine许可证,那么在你将它安装到新的第二台机器上时它就不应该只是工作了。 it,你会想要一个好的错误消息,以防止额外的支持来电次数更多,但不花费额外的时间让游戏很难变通解决,而且无需再按通过头前把用户

另一个例子是time-limited试用版。 不要担心简单的事情,比如用户是否可以回滚系统时钟。 由于违反你所做enough,有人谁会像你这样知道他们正在打破你的许可,而只要一个用户知道如果他们 are.

你需要这么做,因为用户不关心你的许可证。 许可证都被没有人 made-up事情,在乎不清楚,直到他们需要。 没有人读取它们,他们真的不应该。 因此告诉用户边界的最佳方法是如果你的应用程序的out-of-the-box行为符合许可协议。 在第一种情况下,意味着在trial-version模式下安装或者安装失败。 对于后者,它可能只是在一个配置文件中检查一个plain-text日期。 无论哪种方式,都要以优雅,有帮助和尊敬的方式处理它。

所以这就解释了这么多。 但为什么不更进一步? 为什么不把你能找到的每个小洞都 plug? 答案是两个部分。 首先,如果某些人将越过道德门槛有意识地弄坏你的许可条款 — —即使在一个简单的方式他们还将会自愿做一些事情比较困难或者危险的喜欢拉你的应用程序从一个洪流网站—和存在一定数量的危险,正在运行的应用程序所涉及的下载来自非信任源 你的付费customers,制作它的难度由选择问题烦恼为这些用户和风险导致唯一的一个小 保持简单可能会阻止某人挖掘你的应用并释放更全面的裂缝。 第二,你没有眼睛去寻找缺陷;黑客有很多,他们有更多的实践来寻找他们。 你只需要错过一个小小的漏洞,你的应用就会在盗版站点上有同样的分布,就像你没有做什么一样。 你每次都是正确的,他们只能是幸运的。 所以所需要的努力非常高,任何衡量成功的可能性都很低。

最终,如果有人要海盗( 与使用它相反) 你的应用,那是他们的主要目标,他们会 你不能阻止他们。 他们为他们 wish, 这是软件;一旦文件来加快你的产品的性质在计算机上的用户浏览他们将是能力要做,他们 这在像Java或者 .NET 这样的托管环境中尤其重要,但它同样适用于本机代码。 时间在他们这边,只要有足够的时间,任何数字安全都可以被破坏。

因为你不能阻止用户盗版你的产品,你最好的行动过程是让这个用户的类使用你的利益。 通常可以让他们为你工作而不是针对你。 考虑到这一点,不管你的应用程序是什么,它可能是值得的,它有一个几乎完全功能,而且不会过期的免费版本。 他们的信用card,甚至一个US$1价格标签和免费之间的差异是巨大的,如果没有别的原因,客户不必信任你们。 免费版本的产品不仅能有效地杀死盗版发行( 当你可以合法地使用相同的价格时,为什么要冒盗版的风险),它也有可能极大地扩展你的受众。

于该"专业版"相关的结果是,你可能需要增加的价格 edition, for-pay版本,以便在最后而不是在每个你有 100,000 $20 2,000用户的免费用户,其中 500愿意支付 这给你带来了比你花大量时间锁定你的产品的金钱。 更重要的是,你可以通过几种重要的方式来吸引这些自由用户并利用这些关系。

一个是支持。一个悲观者会借此机会抱怨支持 100,000自由用户的成本增加了,但是发生了一些惊人的事情: 你的产品基本上是自我支持的。 你一直都在使用开源项目,而这些项目没有支持成本的资金。 用户将上升并使它的发生。

自由用户通常减少了对开始的支持,并且出于良好的原因。 你所需要做的就是把free免费版mark标记为community社区支持 qualifying,并为此目的设立一个user-moderated在线论坛。 你的支持知识库是 self-generating,高级用户将为你提供额外的hand-holding支持。 更重要的是,这将允许你更快地识别和纠正 Bug,最终提高产品质量并降低总支持成本。 这是不可能的,因为你的用户基础不够大,但是当你将免费用户当作客户对待时,它可以很好地工作。

另一个是反馈。通过观看你的论坛,你可以学到一些重要的改进想法,你可能从未考虑过。 这可以让你最终将更多的免费用户变成付费用户,并创建一个更具吸引力的产品,吸引更大的受众。

最后,你需要考虑市场营销。 所有这些自由用户现在都是粉丝而不是对手,他们将采取相应行动。 不仅如此,而且当你发布你的下一个版本时,这些用户都会经过你批准的分销渠道,而不是其他未知的机制。 这意味着你的下一个版本将与一个更大,更有兴趣和支持的观众联系起来。

为专业版保留的最佳功能是工具,旨在使企业部署和管理变得容易。 破解者不会看到这些作为一个引人注目的足够理由 hack 它达到自己的使用,但是对于一个业务准备购买 300许可证和把它传输company-wide这是一个 must-have 。 当然,专业版仍将被盗版,但是: 别乱花,因为你也不太可能能卖出产品给那些海盗无论你所做的,所以它不是地理位置展示 任何收入。

尽管在心理学上很难放弃你的产品,希望你能理解它是最好的方式去去。 不仅如此,它是长期的唯一方法。 我知道有人在想他们不想这样做。 毕竟,他们已经很好地销售了 locked-down $20产品。 但这太糟糕了,因为如果你不这样做的话,最终会 。 自称 that,,再让他们的产品将是一样好的是属于你的,或者非常接近他们拿走了。 然后突然间你的定价看起来 outrageous 。销售大幅度下降,还有没有别的方法可以做。 如果必须,你可以选择一个额外的中间层,但这不太可能帮助你。

以我的经验,让你的应用程序或者库更容易破解伤害你的诚实客户,而只是稍微延迟不诚实的用户。 专注于制造一个大的,低摩擦的产品,而不是花费大量的努力来延缓不可避免的延迟。

你与许多人分享的秘密不是秘密。 如果你的代码中有秘密的东西,混淆它就不受保护;它只能是 deobfuscated 一次。 如果你有一个秘密,你不想与你的客户分享,那么不会与你的客户共享它。 将你的代码作为网络服务编写并在你自己的服务器上保留你的超级机密代码,只有你可以看到它。

你不能阻止人们破解你的软件。

但是,你可以让他们产生一些裂痕,这会影响你的销售。 能够为你的软件颁发有效注册代码的Keygenerators比从你的软件删除注册激励的简单补丁要糟糕得多。 这是因为只有一个软件版本会对一个软件版本起作用,并且会停止下一次发布的软件更新。 keygenerator将继续工作,直到你更改了注册密钥算法,这是你不想经常做的事情,因为它会让你的诚实客户摆脱。

因此,如果你正在寻找一个方法来对抗非法keygenerators的软件,你不想使用assymetric加密,因为长时间的注册代码,你可能会看到部分密钥验证。

部分密钥验证确保每个非法的keygenerator仅适用于你的软件的一个特定版本。 基本上你要做的就是确保每个版本的软件只链接到代码来检查注册代码的一些数字。 哪个数字是随机的,所以饼干需要反向工程许多不同版本的软件,并将所有的软件组合在一起,以便释放一个适用于所有软件版本的keygenerator 。

如果你定期发布新的软件版本,这将导致大量的软件盗版存档,这些档案都不工作。 潜在的软件销售商通常会寻找最新版本的漏洞或者漏洞,所以他们可能会尝试一些,最终放弃。

我在( C++ ) 新的共享游戏中使用了部分密钥验证,它已经非常有效了。 在我们有大量的keygenerators问题之前,我们无法战斗。 Afterewards有大量的裂纹和一些keygenerators只适用于这个游戏的特定版本,但没有一个可以用于所有版本的密钥生成器。 我们定期发布非常小的游戏更新,并渲染所有以前存在的裂缝。

似乎有一个开源的. NET 框架用于部分密钥验证,虽然我没有尝试。

总的来说,这里有三组人。 那些不会购买你的软件,或者找不到漏洞的人,或者他们找不到你的软件,根本不用你的软件。 不要指望从此组中赚钱。 他们要么自己技能或者饼干上的依赖( 倾向于优先考虑他们的时间根据你的有用和有多大你的受众是谁。 越有用,裂纹就越早可用。

另一个是要购买( 付款方式)的合法用户组,不管你使用什么保护机制。 不要让你的合法用户使用复杂的保护机制,因为他们在任何情况下都会付出代价。 复杂的保护机制很容易破坏用户体验,你不希望这种情况发生在这个组。 我个人会反对任何硬件解决方案,这将增加你的软件成本。

第三,少数不会求助于"不道德的"的人,并为你的软件支付费用,因为它的特性受授权机制保护。 你可能不想让这个小组轻易地绕过你的保护。 然而,你在保护你的软件上付出的所有努力都会回报,这取决于这组人的规模。 这完全取决于你正在构建的软件类型。

考虑你说的是什么,如果你认为存在一个足够大少数民族谁可以被迫购买你的软件,继续和实现某种形式的保护。 想想多少钱,你来做从防止数据从这个少数vs你所花费的时间工作,或者一个 api/第三方保护工具上花费的数字时。

如果你想实现自己的解决方案,使用public-key加密是( 与对称算法相对应)的一种好方法,可以防止攻击。 你可以为你的许可证( 序列号,或者许可证文件) 进行数字签名。 唯一的方法来绕过这个限制就会被反编译中,改变并重新编译它的代码的simucal ( 你可以使用一些技巧,比如回答那些建议) 。

  • 使用联机更新来阻止那些未授权的副本。

  • 验证应用程序不同模块的序列号,不使用单个函数调用进行验证( 这样饼干就不会轻易绕过验证) 。

  • 不仅要在启动时检查序列号,还要在保存数据时进行验证,在星期五晚上完成,在用户空闲时做。。

  • 验证应用程序文件检查总和,将你的安全检查总和存储在不同位置。

  • 不要过分依赖这些技巧,确保你的应用程序从不崩溃/在验证注册代码时出现故障。

  • 为用户构建一个有用的应用比制作一个
    用于饼干的不可破解的二进制。

.NET 反射器只能打开"托管代码",这基本上意味着".NET 代码"。 所以你不能用这个来拆卸comdll文件,本机 C++,经典 visualbasic 6.0 代码,等等 编译. NET 代码的结构使得它非常方便的。可以移植的可以发现性。可以验证性 等等. NET 反射器利用了这里以允许你深入查看编译的程序集,但反编译器最后和disassemblers绝不是特定于. NET 和已经存在了只要编译器已经存在了。

你可以使用obfuscators使代码更难于阅读,但你不能精确地防止它被反编译,也不使它无法读取. NET 。 有少数的产品在外面( 通常价格不菲) 宣称可以确保你名列前茅"链接"你的托管代码应用程序转换为本机代码应用程序,但即使这些实际工作中,一个明确的人会为你指引。

然而,在混淆混淆时,你会得到你付出的代价。 所以,如果你的代码是如此的专有,你必须去这么长的时间来保护它,你应该愿意在一个很好的混淆器中投资。

然而,在我的15年左右编写代码的经验中,我意识到作为源代码的over-protective是一个浪费时间并且没有什么好处。 只想阅读原始源代码而不支持文档,注释和 等等,就很难理解。 添加对soa的现代obfuscators没有意义变量名与和的代码大拼盘,这个反编译器最后的出现创建- 你也许没有要过于担心别人窃取了你的知识产权。

如果你希望人们能够运行你的代码( 如果你不这么做,那么你为什么要先写),那么他们的CPU需要能够执行你的代码。 为了能够在代码中,CPU需要能够执行 了解它 。

因为 CPU 是哑的,而人类不是,这意味着人类可以理解代码。

只有一种方法可以确保你的用户不获取代码: 不要给他们你的代码。

这可以通过两种方式实现: 软件即服务 ( SaaS ) 。也就是说,你的运行你的软件在 远程服务器,从而只允许你的用户访问它。 这是堆栈溢出使用的模型,例如。 我确信栈溢出不会混淆他们的代码,但是你不能反编译它。

另一种方式是设备模型: 不给你的用户提供代码,而是给他们一个包含代码的计算机。 这是游戏控制台,大多数手机和 TiVo 使用的模型。 注意,这只在"自有"执行整个执行路径时有效: 你需要构建自己的CPU,自己的计算机,编写自己的操作系统和自己的CLI 实现。 然后,只有你能保护你的代码。 ( 注意,即使是最微小的错误也会使你的所有保护都毫无用处) 。 微软,苹果,索尼,音乐行业和电影行业都可以证实这点。

或者,你可以不做任何事情,这意味着你的代码会被版权法自动保护。

你可以的。

微软SLP服务inishtech潜在的软件提供了帮助保护代码的能力,而不影响应用程序的功能。

在 Eazfuscator.NET) 什么让 , 更新:( 披露:我工作 微软SLP服务 软件潜在的代码,所以你一定可以 不同的是能够虚拟化。 自从问题最初被问过以来,已经过了几年;今天有更多的产品可以在类似的基础上工作,比如:

...