我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
当前回答
可以将py2exe字节码放在C启动器的加密资源中,在内存中加载并执行它。这里和这里有一些想法。
有些人还想到了一种自我修改程序,使逆向工程变得昂贵。
您还可以找到防止调试器、使反汇编程序失败、设置错误调试器断点和使用校验和保护代码的教程。搜索[" crypded code" execute "in memory"]以获得更多链接。
但正如其他人所说,如果你的代码值得,逆向工程师最终会成功。
其他回答
你的雇主是否意识到他可以“偷”回其他人从你的代码中得到的任何想法?如果他们能读懂你的作品,你也能读懂他们的。也许看看你如何能从这种情况中受益,会比担心你可能会失去多少,获得更好的投资回报。
[编辑]回答尼克的评论:
没有得到也没有失去。客户得到了他想要的东西(因为他自己进行了更改,所以已经为此付费了)。因为他没有发布变更,就好像它没有发生在其他人身上一样。
现在如果客户出售软件,他们必须更改版权声明(这是非法的,所以你可以起诉并且会赢->简单的案件)。
如果他们不更改版权声明,第二级客户就会注意到软件来自您的原创,并想知道发生了什么。很有可能他们会联系你,这样你就会了解到你的作品被转售的情况。
同样,我们有两种情况:原来的客户只卖了几份。这意味着他们并没有赚到多少钱,所以为什么要麻烦呢。或者是销量。这意味着你有更好的机会了解他们的工作,并为此做些什么。
But in the end, most companies try to comply to the law (once their reputation is ruined, it's much harder to do business). So they will not steal your work but work with you to improve it. So if you include the source (with a license that protects you from simple reselling), chances are that they will simply push back changes they made since that will make sure the change is in the next version and they don't have to maintain it. That's win-win: You get changes and they can make the change themselves if they really, desperately need it even if you're unwilling to include it in the official release.
Python是一种字节码编译的解释型语言,很难被锁定。即使您使用py2exe这样的exe-packager,可执行文件的布局也是众所周知的,Python字节码也很好理解。
通常在这种情况下,你必须做出权衡。保护代码到底有多重要?里面有真正的秘密吗(比如对称加密银行转账的密钥),还是你只是多疑了?选择能让你最快开发出最好产品的语言,并现实地看待你的新想法的价值。
如果您决定确实需要安全地执行许可检查,可以将其编写为一个小的C扩展,这样许可证检查代码就很难(但不是不可能!)进行反向工程,并将大部分代码留在Python中。
使用Python所能做的最好的事情就是模糊一些东西。
剥离所有文档字符串 只分发.pyc编译文件。 冻结它 隐藏类/模块中的常量,这样help(config)就不会显示所有内容
您可以通过加密部分数据并动态解密并将其传递给eval()来增加一些额外的模糊性。但无论你做什么,总会有人打破它。
这些都不能阻止一个坚定的攻击者通过help、dir等方法来分解字节码或挖掘你的api。
有时间限制许可证的想法,并检查它在本地安装的程序将不会工作。即使有完美的混淆,许可证检查也可以被删除。但是,如果您在远程系统上检查许可证,并在关闭的远程系统上运行程序的重要部分,您将能够保护您的IP。
防止竞争对手将源代码作为自己的或编写相同代码的灵感版本,一种保护方法是在您的程序逻辑中添加签名(可以证明代码是从您那里窃取的一些秘密),并混淆python源代码,使其难以阅读和利用。
好的混淆添加了基本相同的保护,你的代码,编译为可执行的(和剥离二进制)。弄清楚模糊的复杂代码是如何工作的可能比实际编写自己的实现还要困难。
这将无助于防止您的程序被黑客攻击。即使有混淆代码,许可证的东西也会被破解,程序可能会被修改,以具有稍微不同的行为(以同样的方式,将代码编译为二进制并不能帮助保护本机程序)。
除了符号混淆可能是一个好主意,不重构代码,这使得一切更加混乱,例如,调用图形指向许多不同的地方,即使实际上这些不同的地方最终做同样的事情。
模糊代码中的逻辑签名(例如,你可以创建程序逻辑使用的值表,但也可以用作签名),可以用来确定代码来自你。如果有人决定使用您的混淆代码模块作为他们自己产品的一部分(甚至在重新混淆它使它看起来不同之后),您可以表明,该代码是通过您的秘密签名窃取的。
另一种让代码更难被窃取的方法是使用jython,然后使用java混淆器。
这应该工作得很好,因为jythonc将python代码转换为java,然后将java编译为字节码。因此,如果混淆了类,就很难理解反编译后会发生什么,更不用说恢复实际的代码了。
jython的唯一问题是你不能使用用c编写的python模块。