【问题标题】:How to make sure that your code is secure?如何确保您的代码是安全的?
【发布时间】:2010-05-27 13:55:37
【问题描述】:

我是一名程序员。我有大约 5 年的不同语言编程经验。我担心我的代码速度,优化使用我的代码的内存,以及良好的编码风格等等。但从未想过我的代码有多安全。所以我反汇编了我的代码,看看黑客能做什么。破解我的密码容易吗? 我看到了!这很容易,因为我正在存储

  1. 序列号作为字符串
  2. 加解密代码也是如此

因此,如果有人对汇编程序了解甚少,他/她只需简单的反汇编程序,经过 10-20 分钟的调试,我的代码就被破解了!!!我猜甚至可以通过用记事本打开exe来完成! :-)

所以我要问的是:

  1. 我应该将这类安全信息存储在哪里?
  2. 提供安全代码的常用策略有哪些?

【问题讨论】:

  • 我称之为受保护的代码。安全通常意味着容易出现漏洞。
  • Go OpenSource :) 或者 webapps,这是未来。

标签: reverse-engineering piracy-prevention


【解决方案1】:

您必须意识到的第一件事是,您永远无法阻止坚定的逆向者破解任何保护方案,因为代码可以做的任何事情,逆向者最终都会找到如何复制它。实现任何可靠保护的唯一方法是让交付的程序只不过是一个愚蠢的客户端,并在逆向者无法访问的某些服务器上首当其冲。

除此之外,您当然可以更难 让一个可能的逆向者破坏您的保护。 Obfuscation 是实现这一目标的第一步。我没有使用混淆器的经验,但我相信您可以在 SO 上找到一些建议。此外,如果您使用的是 C/C++ 等较低级别的语言,只需使用完全优化编译代码并剥离所有调试符号即可获得相当多的混淆。

几年前我读过this article,但我仍然认为它的技术在今天仍然存在。这是一款名为 Spyro 的视频游戏的开发者之一,他在谈论他们用来防止盗版的一套技术。他们声称直到发布 3 个月后才提供破解版,这相当令人印象深刻。

【讨论】:

    【解决方案2】:

    如果您担心盗版,可以采取多种途径。提高代码安全性(混淆、许可代码、将软件绑定到特定 PC、硬件/加密狗保护等)是其中之一,但值得牢记的是,每个软件都可能被破解如果一个足够有才华的人会被打扰。

    另一种方法是考虑软件的定价模型。如果您收取 1000 美元的副本费用,那么就会有很大的动力去尝试破解它。如果你只收 5 美元,那为什么还要费心去破解呢?

    所以需要的是平衡。即使是最基本的保护也将阻止普通人随意复制。除此之外,简单的技术(混淆和许可证代码)和合理的定价策略将使大多数潜在的破解者不值得破解。之后,您开始接触更复杂的技术(需要存在加密狗/CD 才能运行软件,只有在登录到在线许可系统后才能运行软件),这需要花费大量精力/成本来实施并显着增加惹恼真正客户的风险(还记得每个人在购买半条命但不让他们玩游戏时有多恼火吗?)-除非您拥有流行的主流产品(即要保护的巨大收入来源),付出那么多努力可能没有多大意义。

    【讨论】:

      【解决方案3】:

      让它成为网络应用程序。

      【讨论】:

      • Web 应用程序不能被逆向工程。
      【解决方案4】:

      它通常不会得到很好的保护,除非有外部服务在检查你是否可以控制 - 并且那些真正想要“破解”它的人仍然可以欺骗该服务。相反,信任客户并仅提供最低限度的版权保护。我敢肯定 Joel Spolsky 在某处有一篇关于此的文章或播客……这是另一个 related SO question

      我不知道它是否会有所帮助,但 Windows 提供(自 2000 年以来)一种检索和存储加密信息的机制,如果需要,您还可以根据每个应用程序对该存储进行加盐:数据保护 API (DPAPI)

      这是在机器或用户级别上,但使用它存储序列号和一些密钥可能比将它们隐藏在应用程序中更好?

      【讨论】:

        【解决方案5】:

        你说的是哪种安全? 从您保护用户数据的角度来看是否安全?如果是这样,请研究一些真正的密码学并利用现有库来加密您的数据。 win32 API 非常适合这个。

        但是,如果您要阻止破解者窃取您的应用程序?方法有很多,但还是放弃吧。他们会放慢饼干的速度,而不是阻止它们。

        【讨论】:

          【解决方案6】:

          【讨论】:

          • 他想隐藏加密/解密功能
          【解决方案7】:

          首先你必须定义你的代码应该针对什么进行安全保护,这样的安全是没有意义的。

          您似乎担心逆向工程和用户无需付费即可生成许可代码,尽管您没有这么说。为了使这更难,您可以以各种方式混淆您的代码和关键信息。还有一些技术可以使调试器的使用更加困难,以防止逆向工程师单步执行代码并清楚地查看信息。 但这只会使逆向工程变得更加困难,并非不可能

          另一个常见的安全威胁是执行不需要的代码,例如通过缓冲区溢出。

          【讨论】:

          • 我认为我已经详细描述了我的问题。
          【解决方案8】:

          执行此操作的一个简单技术是对所有代码进行异或,并在需要时返回...但这需要与生俱来的汇编知识...我不确定,但您可以试试这个:

          void (*encryptionFunctn)(void);
          void hideEncryptnFunctn(void)
          {
              volatile char * i;
              while(*i!=0xC0) // 0xC0 is the opcode for ret
              {
                  *i++^=0x45; // or any other code
              }
          }
          

          【讨论】:

            【解决方案9】:

            为防止黑客查看您的代码,您应该使用混淆器。混淆器将使用各种技术,这使得理解混淆代码变得极其困难。使用的一些技术是字符串加密、符号重命名、控制流混淆等。查看Crypto Obfuscator,它还具有外部方法调用隐藏、Anti-Reflector、Anti-Debugging 等

            我们的目标是在潜在黑客的道路上设置尽可能多的障碍。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-19
              • 2011-05-25
              • 2017-09-26
              • 1970-01-01
              相关资源
              最近更新 更多