如何保持.NET程序逻辑(合理)秘密?

时间:2012-07-19 06:46:21

标签: .net security obfuscation

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

可能的方法

  1. 模糊处理。我的理解是,混淆会导致性能开销并可能阻碍(合法)调试。那么是否有工具可以混淆选定的方法?

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

  3. 其他

  4. PS:问题显然与Protect .NET code from reverse engineering?试图将想法从那里付诸实践

    有关

    更新

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

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

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

4 个答案:

答案 0 :(得分:2)

Eazfuscator让你只在Release中混淆你的代码,我们正在使用它,不会感到任何性能问题。它也可以让您对所选方法进行模糊处理。请注意,公共方法不能被混淆。

任何像ValidateLicense这样的函数都可以通过一个好的反射器轻松修改,插入一个返回true作为第一行:(我建议你关于程序集中代码注入的这个关键词:http://www.codeproject.com/Articles/20565/Assembly-Manipulation-and-C-VB-NET-Code-Injection

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

对验证的三种可能攻击是

  1. 通过删除对其的调用来绕过验证
  2. 反向工程验证逻辑以显示合法代码
  3. 逆向工程验证逻辑,允许通过修改环境来满足验证条件
  4. 一种方法是在应用程序的几个点验证许可证 - 这有助于缓解1.代码混淆有助于缓解2和3 - 但最终这是一个棘手的问题。

    我的意见是这些方法的组合会阻止基本程序员窃取您的程序,但如果有些事情值得的话,那么有人会这样做。

答案 3 :(得分:0)

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