挑战:最大化混淆逆向工程的成本

时间:2011-02-21 18:32:59

标签: php security obfuscation

免责声明:类似的问题已多次在SO上提出,但这个问题更加具体,到目前为止尚未得到充分解决。

我们正在开发一种新的打包软件,出于商业安全原因,该软件必须在我们客户的服务器上以PHP运行。该软件以每用户最终许可证出售;每个用户的价格范围在20-80美元之间,目标市场是小型(和网络sa)咨询公司和IT代理商。

为了阻止盗版(例如删除用户许可证),我们希望以技术上可用的方式最大限度地保护PHP代码,这不会给用户带来不便。

让我们打破这个:

  • 不会给用户带来不便:没有额外的服务器端安装(没有zend解码器或其他二进制文件)。必须在开箱即用的普通共享PHP主机上运行。

  • 最大限度地保护:打破保护必须超过购买额外许可的成本。也就是说,专业黑客必须至少花3-5个工作日才能取消用户许可保护。

  • 任何技术上可用的方法:可能会调用home,可能使用高端加密,可能会实现c64模拟器。

积极主动解决迄今为止投票最多的非解决方案:

  • 不寻找完美混淆,只需极其(定义为:必须至少需要3-5个工作日才能解密)或其他反盗版方法

  • 不寻找“黑盒”软件包,我不知道它们是如何工作的,也无法确定它是否符合我们的目的;寻找算法和开箱即用的想法。

  • 不寻求许可/法律保护,我们已经涵盖了这一点。

  • 我们知道,如果给予足够的时间和专注,所有混淆迟早会被黑客攻击;我们只是希望这不是一个经济的解决方案。

鉴于上述限制,您将采用哪些方法或想法来最大限度地提高反盗版措施?

Bounty-hunt:在上述限制条件下,对于代码进行反向工程的最难的算法方法是有用的。

更新/ Bounty-hunt:我接受了Ira Baxter的答案,主要是因为其余人未能回答核心问题,并试图质疑潜在的假设(业务,闭源,yadda yadda)。谢谢大家!

9 个答案:

答案 0 :(得分:7)

Obfuscation != Anti-piracy例如,您可能有一个严重混淆的类,但我可以使用反射来查看此类实现的所有方法。然后我可以扩展这个类并覆盖我不喜欢的任何方法。你存的是秘密吗?因为可以使用调试器从内存中提取任何秘密值。

3-5天?即使使用Zend-Guard,使用一些开源工具也需要3-5秒才能中断。大多数混淆工具非常原始且易于破解。

我很抱歉,但我认为没有一个好的解决方案。

答案 1 :(得分:7)

答案 2 :(得分:6)

最好的反盗版方法不是方法。

如果您不想使用zend等工具,那么最好不要做任何事情。

从我这里拿走你可以浪费更多的时间,并试图阻止海盗的销售。你只会伤害自己。嘿,他们不在乎,它的乐趣,你越努力,他们就越满意。一旦完成它将通过洪流为所有人提供。所以没有人需要重复努力。

做一个好的申请。让它运作良好。提供优质的服务,您想要的客户将很乐意付钱。那些你不想要的顾客永远不会付钱,所以不要浪费时间。猜猜看,他们实际上成了很好的广告。人们会在他们寻找的更多网站上看到您的软件。

因此,实际上您正在获得免费广告。

所以不要压力,不要浪费你的时间,如果你的软件失败,不要责怪海盗。责备自己,因为你太过分心试图做不可能的事情

我想补充一点我的个人经历。

回到90年代,我花了很多时间创建加密技术来减少/防止盗版盗版软件,最终我“大部分”成功了。

我使用自定义加密,垃圾插入,随机数生成器,交叉模块CRC检查,等等等等。

我曾经在新闻组中闲逛,致力于黑客攻击我的软件和其他类似的人,甚至打起了对话。一位礼貌的家伙说:“你为什么要浪费时间我们这样做才是为了好玩”。但我被迷住了。这是一场比赛。

如果我花了很多时间和精力来改进软件,那么我认为我已经失去了10倍于盗版的数量。

这是一场愚蠢的胜利。

答案 3 :(得分:2)

我经常考虑这个问题,而你所要求的基本上是不可能的。你可以模糊不清,人们仍然会窃取你的软件。你无能为力。如果您使用代码编写来回家,有人会将其删除,只需将true放入其中即可。最好的办法是编写高质量的软件,以便人们购买。它或者使用像ionCube或Zend这样的商业解决方案。

答案 4 :(得分:1)

只有少数东西可以真正起作用。我能想到的最基本的逻辑是有效的(因为这个市场听起来像它是相当受控制的,并且是有限的)将使用类似于许可服务器的东西,但是具有双向通信通道(你可以加密等) ..等..)。

现在,当然,您可以让某人禁用该通信渠道,但在您要添加的编码之间禁用该软件,以及您的公司将能够跟进客户端的事实,因为您将确切知道它是谁这是“下来”,这将有所帮助。

逻辑的第三部分是针对每个许可证发出的,用于生成软件和许可服务器之间发生的“检查”。这意味着您生成内部部署的唯一哈希码,这些哈希码用作软件发送回服务器的答案的一部分。这几乎排除了黑客攻击,因为黑客必须知道你使用什么算法来生成许可(因为它是预先生成的,没有用来破译它的逻辑)而且黑客必须喂你许可证密钥。

第四步,可选地,是将更新推送到客户端以刷新您现有的安全机制并对您的代码运行“篡改”检查,可能会定期提供某种类型的哈希值,以便在您的软件逻辑中使用用于连接许可服务器。

这仍然不完美,有人“将”能够克隆生产机器,规避/重定向许可(你不会知道,因为它将是一个副本)并试图去检查那个您的代码中需要许可证(如上所述,将所有逻辑设置为“True”)...但您可以明确地花时间在您的许可系统上进行检查和加密,并使其成为一个耗时的工具。 “冒险”过程。除非...作为最后的触摸...你可以从你的服务器生成的产品中获得一些可交付的(没有代码在客户端有什么)并推送到具有这种许可机制的软件..但是我不知道那是多么可能。

答案 5 :(得分:0)

人工代码膨胀

通过使用后处理器自动膨胀代码并插入逻辑乘法器,使代码难以修改

我在原始源中使用标记来指示每种方法中的代码类型以及要使用的代码乘数。随机发生器也可以提供帮助,因为每个版本看起来都非常不同

代码膨胀是通过各种过程实现的。例如在变量正式范围之前和之后重复和随机摆弄变量。许多额外的逻辑步骤永远不会被遵循。将单个语句分成许多随机的小步骤。只要最后一步的顺序正确,就可以将这些语句与尽可能多的其他语句交织在一起。等等

这个过程的最后也是最重要的部分是通过这个混乱来交织密钥生成和调用home进程,并成为这个混乱的一部分(记住“变量的随机摆弄”之前和之后他们正式在范围内“),以便删除密钥生成和回拨所用的时间变得笨拙

呼叫家庭服务器必须像rolling code remote control那样行动,因此当攻击者可能发现呼叫归属功能时,将其取出将导致一般方法中的一般变量的初始化值不正确,并且在很多情况下你可以使用

随着时间的推移,您可以构建通用代码重新解析器,以及用于混淆代码的函数库。继续添加代码混乱库以提高混淆级别

您需要有一个覆盖良好的单元和集成测试库,以便在混乱后验证代码

我没有用PHP做过这个,但是使用与PHP相似的其他语言

注意:这种技术适用于复杂的科学软件,无论如何都有大量的神秘逻辑和数学。除非您的代码乘数非常有说服力,否则对于像CMS这样的典型网站来说,它可能不会那么好用

答案 6 :(得分:0)

如果我说得对,那么为什么不投资一台服务器来交付应用程序的成本,一台可以放在客户端的服务器,只有一个端口为http访问打开,我的意思是1000美元你可以使用一台可以作为软件安全的机器。如果有人试图入侵它,你就会知道。

另一种解决方案可能是:

目前,我正在为一家在全国拥有约350个卖点(商店)的大公司工作。由于我们不能100%依赖互联网连接,我们在每个商店都有一台服务器。此服务器处理实际销售所需的业务,并链接到本地​​数据库。剩下的东西都在总公司的服务器上。现在,职员在他们面前有计算机,所有这些计算机都与本地服务器上托管的应用程序一起工作,本地服务器上的catch是一个注册表,它知道某个服务是否放在本地(在同一台机器上)或远程(在总公司)并根据需要执行呼叫(通过远程位置的http或来自本地服务的直接呼叫)。服务可以放置在任何地方(本地或远程),所有人只需要在注册表中配置它们的位置,只需输入以下关键字之一:本地,远程,应用程序(应用程序关键字意味着首先从远程调用服务,如果失败则在本地调用。这样你就可以做出可接受的妥协。非常必要的东西可以放在本地,其余的业务逻辑可以驻留在你无法触摸它的服务器上。

答案 7 :(得分:0)

简短的回答是否定的,没有办法以如此复杂的方式混淆代码,以至于需要才能破解。简单的解释:混淆是一个双向过程。它可以完成和撤消。如果一台计算机可以做到这一点,那么一个坚定的人也可以这样做 不要浪费那么多时间来保护你的代码,为什么不从流行的电视节目24中得到暗示(旁注:应该从未被取消!)。为了确保脚本不被窃取或向公众显示,他们为每个脚本添加了一个特定于演员,导演,制作人等的数字。您可以通过“水印”每个PHP文件来执行与脚本类似的操作。这可以简单到更改变量名称以反映客户端ID,或者像在多个变量和函数值/名称上传播标识字符一样复杂。尝试将此标识符和/或部分标识符用于脚本中尽可能多的不显眼位置。只有您可以知道创建识别信息的确切组合。这样,如果代码被泄露,你可以起诉责任方。

答案 8 :(得分:-2)

只是一个建议,你可能只想添加所需的代码行,除了看起来像它之外什么都不做。