【问题标题】:.Net Assemblies Security - Prevent Hacking / Reverse-Engineering [closed].Net Assemblies Security - 防止黑客攻击/逆向工程[关闭]
【发布时间】:2012-02-16 19:17:40
【问题描述】:

我已将知识产权编码到最终用户计算机上的 .net 2.0 完全受信任的程序集(.exe + DLL)中,我想保护它免受黑客攻击/反向工程(Web 服务/云计算解决方案)不是一种选择)。以下是我为实现这一目标而收集的一系列技术。

我的问题是:

  1. 我的假设是否正确,或者我在一项或多项技术中做错了什么?
  2. 此列表是否足以防止恶意攻击,还是我应该添加其他保护措施?

提前致谢。

--

建议的技巧

  1. 使用相同的强名称密钥签署所有程序集。
    这有两个好处:
    • A.确保对程序集的任何修改都会使其无用,
    • 乙。所有程序集都将具有相同的公钥,它们可以通过该公钥相互识别。
  2. 对程序集进行数字签名:两者都让用户知道执行的代码来自正确的源,并且 - 添加另一个标识组件,程序集可以通过该组件相互识别。
  3. 通过爬取调用堆栈并验证所有调用者都在“社区”内来执行上述操作。
    可能的线索:
  4. 使用 AOP(例如 Spring.NET)将调用堆栈爬取代码注入到部分/所有方法中。
    • 这主要是因为在 .net 程序集中没有单一入口点(如 Win32 DLL 的 DllMain())。
  5. 对所有程序集进行模糊处理,以阻止逆向工程和反射执行尝试(当然,在模糊处理后会执行强名称签名)。
  6. 集成System.ComponentModel.LicenseProvider 机制。
  7. 利用“InternalsVisibleTo”程序集级属性在预定义的程序集中公开内部。
  8. 可能使用 NGEN 将解决方案转换为本机代码。

需要考虑的要点

  • 实施上述部分或全部内容很可能会导致性能损失,因此应谨慎处理时间关键型处理等问题。
  • CAS 似乎与这种类型的完全受信任的程序集无关。

【问题讨论】:

  • 这不是博客。请遵循发布指南(摘自常见问题解答):“您应该只根据您面临的实际问题提出实用、可回答的问题。闲聊、开放式问题会降低我们网站的实用性,并将其他问题推到首页。 "
  • “这不是一篇单一/最佳答案类型的文章。”那么 StackOverflow不是此类帮助的最佳位置。
  • 点了,我会改写问题。
  • 你的重点是什么?确保没有人知道你的程序是如何做某事的?确保没有人修改行为(即代码更改或完全替换程序集)?
  • 两者兼而有之。我想防止对代码的任何恶意攻击(例如伪装成我的一个的第 3 方程序集);代码篡改(修改行为);确保没有人可以引用/执行代码;并防止实施被逆向工程。简而言之 - 在各个方面为组件提供最大程度的保护。

标签: c# .net security


【解决方案1】:

恐怕你不会得到你想要的所有安全性。你看,这是这些使用中间语言的语言/平台的问题。它必须采用所有运行时实现都可以使用并生成本机代码的格式。

我看过一些关于篡改签名程序集的博客文章。我还没有尝试过,但我认为它有效。除此之外,混淆工具只会使提取代码变得更加困难,但并非不可能提取代码(尽管有一些非常好的工具使它变得非常困难)。而 NGEN 不是为了那个。您仍然需要分发原始程序集。

我认为保护代码最有效和最安全的方法是将其移至无法反编译的技术,例如,将敏感代码移至非托管 C++ 并在 C# 代码上使用 DLLImport。

这并不意味着您不应该尝试保护您的代码,但您应该记住,您不会受到 100% 的保护。如果您负担不起用另一种语言重写敏感代码的费用,请使用混淆和签名。没有比这更安全的了。

【讨论】:

  • +1 用于在非托管 C++ 中编写敏感代码。您对代码执行预防有什么经验/想法?
  • 将您的类型标记为内部类型并使用 InternalsVisibleTo 可以帮助您。如果我没记错的话,它将阻止通过反射进行实例化。如果没有,你可以这样做(警告臭代码!): class MyClass {public MyClass() { if (typeof(MyClass).Assembly.GetName().GetPublicKeyToken() != Assembly.GetEntryAssembly().GetName( ).GetPublicKeyToken()) { throw new Exception("sorry, dude");}}} 但同样,您不会 100% 安全。尽管它可能会使作弊变得如此困难,以至于大多数人都会放弃。一个好的混淆器会使 API 难以理解。
  • 这就是我考虑的方向。为什么它的代码很臭?是什么让它不是 100% 安全的?
  • 重复且丑陋。您可以将其设为通用方法,这样看起来会更好。您还可以使用诸如 postsharp 之类的工具在编译时插入此行为。请记住,尽管这很困难,但重写混淆代码并非不可能。
  • 我完全同意你写的一切。基本上,这是我前进的方向(在我的问题中总结),我很高兴听到它没有偏离轨道。另外,我明白没有什么是牢不可破的,但我的目标是让代码的执行或逆向工程尽可能复杂。感谢您的宝贵时间和您的反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多