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

Sil*_*gon 13 php security obfuscation

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

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

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

让我们打破这个:

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

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

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

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

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

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

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

  • 我们知道,只要有足够的时间和专注,所有混淆迟早都会被黑客攻击; 我们只是希望这不是经济的解决方案.

鉴于上述限制,您将使用哪些方法或想法来最大化反盗版措施?

赏金追捕:鉴于上述限制,点是最难的算法方法来反向设计代码.

更新/赏金:我接受了艾拉巴克斯特的答案,主要是因为其余人未能回答核心问题,并试图质疑潜在的假设(业务,闭源,yadda yadda).谢谢大家!

roo*_*ook 7

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

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

对不起,我认为没有一个很好的解决方案.


Ira*_*ter 7

我认为你想要做的是通过算法转换代码,不仅模糊执行的内容,还混淆数据结构.我们假设我们从开发人员生成的程序的干净版本开始.他总是和干净的版本一起工作.混淆产生了出货版本.良好的混淆将产生具有与原始功能完全相同的功能的装运版本,因此不需要(可以说)进一步测试.

对于控制流加扰,我们的想法是采用您在开始时编写的编写得很好的代码,并通过转换来推动它,通过将必须设置的假设乘以对控制流的决策进行静态(和人工)分析.分析.例如,如果你有两个指针,并通过一个存储一个值,它会影响另一个看到的值吗?根据指针是否有别名,您可以得到两个不同的答案.现在拿N个指针,每个指针可能有别名; 你得到2 ^ N可能的别名关系.如果读者不知道确切的组合,他将无法确定决定是否属实,错误或有条件.当然,生成它的工具会产生其知道结果的条件,因为它设计(生成)指针鼠巢以产生特定结果.

参见代码混淆文献调查(不是我的论文),它讨论了各种控制流和数据流混淆.这可能不是最新的可能摘要,但它非常有启发性.您应该注意到这种混淆对执行时间有一些影响.

关于这个主题的论文清楚地表明,控制和数据流混淆程序对于静态分析器来说是非常难以"理解"的 ; 这些论文提供/参考演示了处理这些混淆程序的算法复杂性.

现在,您可能会认为人们不是静态分析器,因此不会受到同样的限制.你可能是对的; 罗杰彭罗斯(Roger Penrose)着名地说,人们没有图灵机那样的限制; 争论不是通过远射来解决的.但是加密/散列技术的整个基础都基于相同类型的计算复杂性参数.到目前为止,没有人能够足够聪明地以可以在日常生活中使用的方式破解这些技术(好事,或者你的银行帐户将是空的).

要对PHP程序执行此操作,您需要能够解析PHP代码并执行此类转换的工具.我们的DMS软件重新设计工具包具有强大的PHP解析器,可以对代码应用非常复杂的转换.要做到这一点,您希望在所有代码中全局应用转换,而不仅仅是逐个文件.我们没有在PHP上实现这种混淆转换,但如果你真的想这样做,那就是这样.我们已经为我们销售的其他商业产品的PHP程序应用了复杂的转换.

完成所有操作后,理想情况下,您可以将此结果编译为机器代码,例如使用HipHop编译器.(只是编译会击败一些人,但不是严重的软件工程师).

编辑:混淆!= AntiPiracy是其他答案的主题.那么混淆如何帮助?

首先,您需要处理反盗版问题.显而易见的事情是:

  • 为每个文件添加版权注释.这些作为对此事的警告.不好的.
  • 在各个地方添加版权字符串并偶尔打印出来; 这些将最终在记忆中发挥作用,海盗窃取代码; 他也偷了这根绳子.
  • 在应用程序中添加一个字符串,说"许可给".这使得您的客户对于让它被盗是不热心的.
  • 向您的应用程序添加一个检查,确认它在目标客户的计算机上运行.(由于您的应用程序非常便宜,您可能需要自动执行注册过程)
  • 偶尔将应用程序电话带回家的机器ID.

现在,这些步骤阻止某人(在法律上和技术上)窃取您的代码.
如果这就是你所拥有的一切,一个不受干扰的海盗将只是删除技术支票并将其盗窃.

很难阻止某人复制构成你产品的比特流; 电脑太擅长复制了.因此,你的目标是安排他很难获得价值,如果他这样做,那就是混淆的地方.

如果代码被充分混淆,他将很难找到许可证检查和电话回家机制以禁用它们.(我建议进行几次检查,但是没有一次检查,以便让他们很难判断他什么时候成功.)混乱,做得好,应该保护原始所有者姓名的印刷,这意味着原所有者将有一些兴趣防止它被盗,因为你在任何诉讼中都会将他与海盗一起命名.

如果他们打败了许可证,版权打印和电话回放机制,并且只是想在没有告诉你的情况下在后面的房间里运行它,那么你可能会被卡住.(80美元,我无法想象为什么他们为了这个效果而去解决所有这些问题).但是很多小偷想要修改软件来"改进"它,特别是如果他们想要你的市场.严重的混淆将阻止他们这样做; 它甚至会让他们很难添加自己的许可证控制.这严重限制了价值.

他们可能只是偷了它并免费释放到世界; 你希望这里的应用很难破解.如果他们成功了,那么您唯一的好防御就是获得许可的所有者获得的持续升级.

混淆是海盗防御成功的关键,恕我直言.


Dev*_*ris 6

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

如果你不想使用诸如zend之类的工具,那么你最好不要做任何事情.

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

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

所以实际上你正在获得免费广告.

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

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

早在90年代,我花了很多时间创建加密技术来减少/防止大量盗版软件的盗版,最终我"大部分"成功了.

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

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

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

这是一个傻瓜的胜利.