我正在开发一个软件在蟒蛇,将分发给我的雇主的顾客。我的雇主要限制使用的软件有时间限制的许可证文件。

如果我们分发。py文件或甚至。pyc文件,它会很容易(反编译和)取消代码,用于检查许可证文件。

另一方面是我的雇主不想要的代码可以读取我们的客户,担心,该代码可以被盗或者至少是"新颖的想法"。

是否有一个良好的方式来处理这个问题?最好有个现成的解决方案。

该软件将运行在Linux系统(因此我不认为py2exe会做的欺骗).

有帮助吗?

解决方案

Python是一种字节码编译的解释语言,很难锁定。即使您使用像 py2exe 这样的exe-packager,可执行文件的布局也是众所周知的,Python字节码也是如此很好理解。

通常在这种情况下,你必须做出权衡。保护代码真的有多重要?那里有真正的秘密(例如银行转账的对称加密密钥),还是你只是偏执狂?选择能让您以最快的速度开发最佳产品的语言,并对您的新颖想法的价值具有现实性。

如果您确定需要安全地执行许可证检查,请将其写为小型C扩展,以便许可证检查代码可以非常难(但并非不可能!)进行逆向工程,并留下大部分Python中的代码。

其他提示

"是否有一个良好的方式来处理这个问题呢?" 没有。没有什么可以保护,以防止反向工程。甚至固的DVD机已逆向工程和 气密的关键 暴露出来。这就是尽管该法案使这一刑事罪行。

由于没有技术方法可以停止你的客户从阅读你的代码,你必须适用于普通的商业方法。

  1. 许可证。合同。条款和条件。这个仍然有效,即使人们可以阅读的编码。注意,你的一些蟒蛇的基础组件可能需要支付费用之前销售软件的使用这些组件。此外,某些开放源码许可证,禁止隐瞒来源或起源的组成部分。

  2. 提供重大价值。如果你的东西是那么好--在价格是很难拒绝的-有没有激励要浪费时间和金钱逆向工程的任何东西。反向工程是昂贵的。让你的产品微不太昂贵。

  3. 提供升级和增强功能,使任何反向工程一个糟糕的想法。在下一个版本中断他们的反向工程,有没有点。这可以进行极端荒谬的,但是你应该提供新的功能,使下一个版本的价值超逆向工程。

  4. 提供定制费率,那么有吸引力,它们宁愿付出你所做的建立和支持增强。

  5. 使用许可证的其到期。这是残忍的,并会给你一个不好的名声,但它肯定使你的软件停止工作。

  6. 提供它作为一个网络服务。萨涉及没有下载给客户。

Python不是您需要的工具

您必须使用正确的工具来做正确的事情,并且Python不是设计为混淆的。恰恰相反;一切都是开放的或易于在Python中显示或修改,因为这是语言的哲学。

如果您想要无法透视的内容,请寻找其他工具。这不是一件坏事,重要的是存在不同用途的几种不同工具。

混淆真的很难

即使编译的程序也可以进行逆向工程,因此不要认为您可以完全保护任何代码。您可以分析混淆的PHP,破坏闪存加密密钥等。每次都会破解Windows的新版本。

有法律要求是一个很好的方法

您不能阻止某人滥用您的代码,但您可以轻松发现是否有人这样做。因此,这只是一个偶然的法律问题。

代码保护被高估

如今,商业模式倾向于销售服务而非产品。你不能复制服务,盗版或盗取它。也许现在是时候考虑顺其自然......

编译python并分发二进制文件!

明智的想法:

使用 Cython Nuitka Shed Skin 或类似的东西将python编译为C代码,然后将您的应用程序分发为python二进制文件库(pyd)代替。

这样,我认为没有任何Python(字节)代码,你已经做过任何合理数量的暗示,任何人(即你的雇主)都可以从常规代码中获得。 (.NET或Java比这种情况更安全,因为该字节码不会被混淆,并且可以相对容易地反编译成合理的源。)

Cython越来越与CPython兼容,所以我认为它应该有效。 (我实际上是在为我们的产品考虑这个问题。我们已经建立了一些第三方库作为pyd / dll,所以将我们自己的python代码作为二进制文件运送对我们来说并不是一个过大的步骤。)

参见此博客文章(不是由我)提供有关如何操作的教程。 (thx @hithwen)

疯狂的想法:

你可能会让Cython分别为每个模块存储C文件,然后将它们全部连接起来并用重型内联构建它们。这样,你的Python模块非常单一,很难用常用工具进行芯片化。

超越疯狂:

如果可以静态链接(并优化)python运行时和所有库(dll),则可以构建单个可执行文件。这样,拦截来自/来自python的调用以及你使用的任何框架库肯定是很困难的。如果您使用的是LGPL代码,则无法完成此操作。

我知道您希望您的客户使用python的强大功能,但不希望公开源代码。

以下是我的建议:

(a)将代码的关键部分写为C或C ++库,然后使用 SIP swig 将C / C ++ API公开给Python命名空间。

(b)使用 cython 而不是Python

(c)在(a)和(b)中,应该可以使用Python接口将库分发为许可二进制文件。

你的雇主是否知道他可以“偷”支持其他人从您的代码中获得的任何想法?我的意思是,如果他们能读你的作品,他们也可以。也许看看如何从这种情况中获益将会比你担心损失多少会带来更好的投资回报。

[编辑]回答尼克的评论:

没有任何收获,也没有任何损失。顾客拥有他想要的东西(并且因为他自己做了改变而付了钱)。由于他没有发布变更,所以就好像其他人都没有这样做。

现在,如果客户出售该软件,他们必须更改版权声明(这是非法的,因此您可以起诉并赢得 - >简单的案例)。

如果他们没有更改版权声明,二级客户会注意到该软件来自您原创并且想知道发生了什么。他们很可能会与您联系,因此您将了解转售您的工作。

我们又有两个案例:原始客户只卖了几份。这意味着他们无论如何也赚不到多少钱,所以为什么要这么麻烦。或者他们批量出售。这意味着你有更好的机会了解他们做了什么并做了些什么。

但最终,大多数公司都试图遵守法律(一旦他们的声誉被破坏,开展业务就会困难得多)。所以他们不会偷你的工作,而是和你一起改进它。因此,如果您包含源代码(具有保护您免受简单转售的许可证),他们可能会简单地推回他们所做的更改,因为这将确保更改在下一个版本中,并且他们不必维护它。这是双赢的:你得到了改变,即使你不愿意将它包括在官方版本中,他们也可以自己做出改变,如果他们真的迫切需要它。

您是否看过 pyminifier ?它确实缩小,混淆和压缩Python代码。对于偶然的逆向工程,示例代码看起来非常讨厌。

$ pyminifier --nonlatin --replacement-length=50 /tmp/tumult.py
#!/usr/bin/env python3
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲמּ=ImportError
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱=print
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ巡=False
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ澨=object
try:
 import demiurgic
except ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲמּ:
 ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱("Warning: You're not demiurgic. Actually, I think that's normal.")
try:
 import mystificate
except ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲמּ:
 ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱("Warning: Dark voodoo may be unreliable.")
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲﺬ=ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ巡
class ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐦚(ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ澨):
 def __init__(self,*args,**kwargs):
  pass
 def ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ클(self,dactyl):
  ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ퐐=demiurgic.palpitation(dactyl)
  ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𠛲=mystificate.dark_voodoo(ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ퐐)
  return ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𠛲
 def ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐠯(self,whatever):
  ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱(whatever)
if __name__=="__main__":
 ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱("Forming...")
 ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲﺃ=ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐦚("epicaricacy","perseverate")
 ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲﺃ.ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐠯("Codswallop")
# Created by pyminifier (https://github.com/liftoff/pyminifier)

不依靠混淆。因为你已正确地得出结论,它提供非常有限的保护。更新:这里是一个 链接到纸 它的反向工程模糊代码在序。办法-操作码映射是一个良好的阻挡的,但是显然它可能被打败。

相反,作为许多海报已经提到使它:

  • 不值得的逆向工程的时间(你们的软件是如此之好,很有意义付款)
  • 让他们签署一份合同和做一个许可证审计,如果可行的。

或者,如踢屁股Python IDE WingIDE: 给代码.这是正确的,给代码的距离有人回来为的升级和支持。

运送.pyc文件存在问题 - 它们与其创建的python版本不兼容任何其他python版本,这意味着您必须知道产品将运行的系统上运行的是哪个python版本。这是一个非常有限的因素。

在某些情况下,可以将软件(全部或至少一个关键部分)移动到您的组织托管的Web服务中。

这样,可以在您自己的服务器机房的安全性下执行许可证检查。

虽然没有完美的解决方案,但可以做到以下几点:

  1. 将一些关键的启动代码移动到本机库中。
  2. 在本机库中强制执行许可检查。
  3. 如果要删除对本机代码的调用,程序将无法启动。如果没有删除,则将强制执行许可。

    虽然这不是跨平台或纯Python解决方案,但它会起作用。

保护代码的唯一可靠方法是在您控制的服务器上运行它,并为您的客户端提供与该服务器连接的客户端。

我认为还有一种方法可以保护您的Python代码;混淆方法的一部分。我相信有一个像Mount和Blade这样的游戏或者改变并重新编译了他们自己的python解释器(我认为是开源的原始解释器)并且只是改变了OP代码表中的OP代码而不是标准的python OP码。

所以python源是未修改的,但* .pyc文件的文件扩展名不同,操作码与公共python.exe解释器不匹配。如果您检查了游戏数据文件,则所有数据都是Python源格式。

可以通过这种方式解决各种不成熟的黑客问题。阻止一群没有经验的黑客很容易。这是你不可能击败的专业黑客。但是大多数公司并没有让我的黑客长期存在于我想象中(可能是因为事情被黑客入侵)。但不成熟的黑客到处都是(好像是好奇的IT人员)。

例如,您可以在修改后的解释器中,允许它检查源中的某些注释或文档字符串。您可以为此类代码行提供特殊的OP代码。例如:

OP 234用于源代码行“#Ind rights I be this”" 或者将该行编译成等同于“if False:”的操作码。如果“#Copyright”不见了。基本上禁用整个代码块似乎是一些不明原因。

重新编译修改后的解释器可能是可行的一个用例是你没有编写应用程序,应用程序很大,但是你需要付费才能保护它,例如当你是一个专用的服务器管理员用于财务时应用

我发现将源或操作码打开眼球有点矛盾,但使用SSL进行网络流量。 SSL也不是100%安全的。但它用来阻止大多数人的眼睛阅读它。一点点的预防措施是明智的。

此外,如果有足够多的人认为Python源代码和操作码太明显,那么最终可能会有人为它开发至少一个简单的保护工具。所以越多人问“如何保护Python应用程序”只促进这种发展。

取决于客户端是谁,一个简单的保护机制,与合理的许可协议相结合,比任何复杂的许可/加密/混淆系统更有效。

最好的解决方案是将代码作为服务销售,比如通过托管服务或提供支持 - 尽管这并不总是实用。

将代码作为 .pyc 文件运送,可以防止您的保护被一些挫败,但它几乎没有有效的反盗版保护(就好像有这样的技术),并且在一天结束时,它不应该达到与公司签订合适的许可协议的任何内容。

专注于使您的代码尽可能好用 - 拥有满意的客户将使您的公司远远超过防止理论上的盗版行为。

使用 Cython 。它会将您的模块编译为高性能的C文件,然后可以将其编译为本机二进制库。与.pyc字节码相比,这基本上是不可逆的!

我写了一篇关于如何为Python项目设置Cython的详细文章,请查看:

使用Cython保护Python源代码

使代码更难窃取的另一种尝试是使用jython然后使用 java obfuscator

这应该可以正常工作,因为jythonc将python代码转换为java,然后将java编译为字节码。所以,如果你对这些类进行模糊处理,那么在反编译后很难理解发生了什么,更不用说恢复实际的代码了。

jython的唯一问题是你不能使用用c编写的python模块。

如何使用标准加密方案通过散列和签名重要文件并使用公钥方法进行检查来对代码进行签名?

通过这种方式,您可以为每个客户发布带有公钥的许可证文件。

另外你可以使用像这个的python混淆器(只是谷歌搜索它。)

你应该看看getdropbox.com的人如何为他们的客户端软件做这件事,包括Linux。破解是非常棘手的,需要一些非常有创意的反汇编才能通过保护机制。

我很惊讶于看不到 pyconcrete 在任何答复。也许因为它是比较新的问题?

这可能是你需要什么(ed)。

而不是混淆代码,进行加密和解密以在装载时间。

pypi页:

保护python脚本的工作流程

  • your_script.py import pyconcrete
  • pyconcrete将钩入模块
  • 当你的脚做进 MODULE, pyconcrete进口挂钩将会尝试寻找 MODULE.pye 第一,然后 解密 MODULE.pye 通过 _pyconcrete.pyd 并执行解密数据(如 .pyc内容)
  • 加密和解密的秘密钥匙的记录 _pyconcrete.pyd (DLL或使)秘密的关键将是隐藏在二进制代码,不可能 直接看到它在六角看

你能做的最好与蟒是要掩盖的东西。

  • 带了所有的文档字符串
  • 只分发。pyc编制的文件。
  • 冷冻它
  • 掩盖你的常量内部的一个类/模块,以便帮助(配置)没有显示出一切

你可能增加一些额外的默默无闻,通过加密的一部分和解它在飞行中并通过它eval().但无论你做什么人可以打破。

没有这将阻止一个确定攻击者拆卸码或通过挖掘你的api的帮助下,dir,等等。

有时间限制许可证并在本地安装的程序中检查它的想法是行不通的。即使有完美的混淆,也可以删除许可证检查。但是,如果您检查远程系统上的许可证并在封闭的远程系统上运行程序的重要部分,您将能够保护您的IP。

防止竞争对手将源代码用作自己的代码或编写相同代码的灵感版本,一种保护方法是向程序逻辑添加签名(一些秘密能够证明代码是从您那里窃取的)并且混淆了python源代码,因此很难阅读和利用。

良好的混淆为您的代码添加了基本相同的保护,将其编译为可执行文件(以及剥离二进制文件)。弄清楚混淆的复杂代码如何工作可能比实际编写自己的实现更难。

这无助于防止程序被黑客攻击。即使使用混淆代码,许可证的内容也会被破解,并且程序可能会被修改为具有稍微不同的行为(与将代码编译为二进制文件无法帮助保护本机程序的方式相同)。

除了符号混淆之外,重写代码可能是个好主意,这使得一切都变得更加混乱,例如,调用图指向许多不同的地方,即使实际上那些不同的地方最终会做同样的事情。

混淆代码中的逻辑签名(例如,您可以创建程序逻辑使用但也用作签名的值表),可用于确定代码是否源自您。如果有人决定使用您的混淆代码模块作为他们自己产品的一部分(即使在重新进行混淆以使其看起来不同之后),您可以显示该代码被您的秘密签名窃取。

我一直在研究自己的项目的软件保护,一般的理念是完全保护是不可能的。您可以希望实现的唯一目标是将保护添加到一个级别,这个级别会使您的客户更多地绕过,而不是购买另一个许可证。

有了这个说我只是在谷歌检查python封闭,并没有提出很多任何东西。在.Net解决方案中,在Windows平台上阻塞是第一种解决问题的方法,但我不确定是否有人在Linux上使用与Mono一起使用的解决方案。

接下来的事情是用编译语言编写代码,或者如果你真的想要一直使用汇编语言。一个被剥离的可执行文件比解释语言更难反编译。

这一切都取决于权衡。一方面,你可以轻松地在python中进行软件开发,其中也很难隐藏秘密。另一方面,你有用汇编语言编写的软件,这个软件更难写,但更容易隐藏秘密。

你的老板必须选择一个支持他的要求的连续统一体点。然后他必须给你工具和时间,这样你就可以建立他想要的东西。但我敢打赌,他会反对实际开发成本与潜在的金钱损失。

可以将py2exe字节代码放在C语言启动程序的加密资源中,以便在内存中加载并执行它。一些想法此处此处

有些人还想到了一个自修改程序工程昂贵。

您还可以找到防止调试程序的教程,使反汇编程序失败,设置 false debugger breakpoints 并使用校验和保护您的代码。搜索[“加密代码”]执行“在内存中”获取更多链接。

但正如其他人已经说过的,如果您的代码值得,逆向工程师最终会成功。

长话短说:

  1. 加密源代码
  2. 编写您自己的python模块加载程序,以便在导入时解密您的代码
  3. 在C / C ++中实现模块加载器
  4. 您可以为模块加载器添加更多功能,例如反调试器,许可证控制,硬件指纹绑定等。
  5. 有关详细信息,请查看此答案

    如果您对该主题感兴趣,此项目将为您提供帮助 - pyprotect

如果我们专注于软件许可,我建议您查看我在这里写的另一个Stack Overflow答案从如何构建许可证密钥验证系统中获得灵感。

GitHub 上有一个开源库,可以帮助您进行许可证验证位。

您可以通过 pip install licensing 安装它,然后添加以下代码:

pubKey = "<RSAKeyValue><Modulus>sGbvxwdlDbqFXOMlVUnAF5ew0t0WpPW7rFpI5jHQOFkht/326dvh7t74RYeMpjy357NljouhpTLA3a6idnn4j6c3jmPWBkjZndGsPL4Bqm+fwE48nKpGPjkj4q/yzT4tHXBTyvaBjA8bVoCTnu+LiC4XEaLZRThGzIn5KQXKCigg6tQRy0GXE13XYFVz/x1mjFbT9/7dS8p85n8BuwlY5JvuBIQkKhuCNFfrUxBWyu87CFnXWjIupCD2VO/GbxaCvzrRjLZjAngLCMtZbYBALksqGPgTUN7ZM24XbPWyLtKPaXF2i4XRR9u6eTj5BfnLbKAU5PIVfjIS+vNYYogteQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"

res = Key.activate(token="WyIyNTU1IiwiRjdZZTB4RmtuTVcrQlNqcSszbmFMMHB3aWFJTlBsWW1Mbm9raVFyRyJd",\
                   rsa_pub_key=pubKey,\
                   product_id=3349, key="ICVLD-VVSZR-ZTICT-YKGXL", machine_code=Helpers.GetMachineCode())

if res[0] == None not Helpers.IsOnRightMachine(res[0]):
    print("An error occured: {0}".format(res[1]))
else:
    print("Success")

您可以在此处详细了解RSA公钥等的配置方式。

使用cxfreeze(py2exe for linux)可以完成这项工作。

http://cx-freeze.sourceforge.net/

它可以在ubuntu存储库中找到

使用同样的方式保护的二进制文件的c/c++,那就是,模糊处理的每个功能的身体可执行或图书馆的二进制文件,插入一个指示"跳跃"在开始的每一个条目的功能,跳到特殊的功能恢复混乱的代码。字节的代码是二进制代码Python脚本,所以

  • 第一编python脚本代码对象
  • 然后迭代,每个代码目的,混淆co_code的每一个码的对象为下列
    0   JUMP_ABSOLUTE            n = 3 + len(bytecode)

    3
    ...
    ... Here it's obfuscated bytecode
    ...

    n   LOAD_GLOBAL              ? (__pyarmor__)
    n+3 CALL_FUNCTION            0
    n+6 POP_TOP
    n+7 JUMP_ABSOLUTE            0
  • 保存加密代码的对象。pyc。pyo文件

这些模糊处理的文件(.pyc。pyo)可使用的正常蟒蛇的口译,当这些代码对象是所谓的第一次

  • 第一op JUMP_ABSOLUTE,它会跳到偏n

  • 在偏n,该指令是叫PyCFunction.这种功能会恢复的那些模糊的字节之间的偏3和正,把原来的字节的代码offset0.模糊的代码可以通过以下代码

        char *obfucated_bytecode;
        Py_ssize_t len;
        PyFrameObject* frame = PyEval_GetFrame();
        PyCodeObject *f_code = frame->f_code;
        PyObject *co_code = f_code->co_code;      
        PyBytes_AsStringAndSize(co_code, &obfucated_bytecode, &len)
    
  • 在此之后能返回,最后的指令是跳来 offset0.真正的字节的代码现在是执行。

有一个工具 Pyarmor 混淆python脚本,通过这种方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top