5

对,我说的是桌面应用程序中的许可证验证代码,例如方法bool ValidateLicense(string licenseCode)。当然,任何保护方案都可以由熟练且坚定的破解者进行逆向工程。但是,我想防止任何具有一些基本编程知识的人都可以在几分钟内使用 Reflector 构建一个注册机。

可能的方法

  1. 混淆。我的理解是混淆会导致性能开销,并可能阻碍(合法的)调试。那么是否有工具允许仅对选定的方法进行混淆?

  2. 将方法移动到生成的程序集或非托管 DLL。但这不是简单地替换 DLL 的邀请吗?任何想法如何防止这种情况(阅读:让攻击者更难)?

  3. 其他

PS:问题显然与保护 .NET 代码免受逆向工程有关?试图把那里的想法付诸实践

更新

1. 第一个混淆步骤肯定是重命名验证方法。(谢谢,乔纳森)

2. 假设应用程序使用 Win32 API 方法,可以通过非托管 DLL 重新路由调用,从而使其成为应用程序的一个组成部分。摆弄方法签名(例如更改名称、交换参数)会使这一点变得不那么明显。你认为先天的缺点是合理的吗?

到 3.不分发验证方法属于这里。将其保存在您的服务器上并远程调用,即使用在线验证(谢谢,David Hedlund)

4

4 回答 4

2

Eazfuscator让您仅在 Release 中混淆您的代码,我们使用它不会感到任何性能问题。它也可以让您混淆选定的方法。请注意,公共方法不能被混淆。

像您的 ValidateLicense 这样的任何功能都可以通过一个良好的反射器轻松修改,在第一行插入一个 return true :( 我向您推荐这篇关于程序集中代码注入的文章:http: //www.codeproject.com/Articles/20565/Assembly-操作和 C-VB-NET-代码注入

您应该签署您的程序集以避免修改,但是......也可以使用适当的工具删除签名:http: //www.nirsoft.net/dot_net_tools/strong_name_remove.html

抱歉,在 .Net 中没有任何技巧可以避免逆向工程,你只能让事情变得更难。(例如,不要命名你的函数 ValidateLicense 并使你的验证逻辑有点神秘)

于 2012-07-19T06:53:38.817 回答
2

许多软件供应商采用的一种方法是要求在线激活。这样,密钥验证代码只能在您的服务器上执行,这将使潜在的黑客更难以访问。

当然,如果黑客知道或可以提取有关此类响应的预期外观的信息,那么您将引入新的漏洞,即只需将验证调用重新路由到发送成功响应的自定义服务器即可。但是,正如您所指出的,总会有人能够破解您的产品,所以我仍然会说这是一个可行的选择。

于 2012-07-19T06:55:59.680 回答
2

对验证的三种可能攻击是

  1. 通过删除对它的调用来绕过验证
  2. 逆向工程验证逻辑以揭示合法代码
  3. 逆向工程验证逻辑以允许通过修改环境来满足验证条件

一种方法是在应用程序中的多个点验证许可证——这有助于缓解 1。代码混淆有助于缓解 2 和 3——但最终这是一个棘手的问题。

我的观点是这些方法的组合可以防止基本的程序员窃取你的程序,但话又说回来,如果有什么值得的——那么有人会这样做。

于 2012-07-19T06:58:38.530 回答
1

我知道这不是答案,但我建议使用 .NET Reactor http://www.eziriz.com/,因为它已经具有许可机制(具有各种许可方案)和强大的代码保护机制。

于 2012-07-19T07:14:39.837 回答