我如何保护Python代码?

我正在开发一个Python软件,将分发给我的雇主的客户。 我的雇主希望限制软件的使用时间限制的许可证文件。

如果我们分发.py文件甚至.pyc文件,则很容易(反编译)并删除检查许可证文件的代码。

另一个方面是,我的雇主不希望代码被客户读取,担心代码可能被盗用,或者至less是“新颖的想法”。

有没有一个好办法来解决这个问题? 最好用现成的解决scheme。

该软件将运行在Linux系统(所以我不认为py2exe会做的伎俩)。

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

通常在这种情况下,你必须做一个权衡。 保护代码真的有多重要? 那里是否有真正的秘密(比如银行转账的对称encryption的关键),还是你只是偏执狂? select能让你最快速地开发出最好的产品的语言,并且对于你的新颖想法是多么有价值而言是现实的。

如果您确定您确实需要安全地执行许可证检查,请将其作为一个小的C扩展名写入,以便许可证检查代码可以非常困难(但并非不可能)来进行反向工程,并将大部分代码保留在Python中。

“处理这个问题有没有好的办法?” 不。没有什么可以防止逆向工程。 甚至DVD机器上的固件也被反向devise,并暴露出AACSencryption密钥 。 尽pipe数字千年版权法案(DMCA)将其视为刑事犯罪,

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

  1. 许可证。 合同。 条款和条件。 即使人们可以阅读代码,这仍然有效。 请注意,在您使用这些组件销售软件之前,您的一些基于Python的组件可能需要您付费。 此外,一些开源许可证禁止您隐藏该组件的来源或来源。

  2. 提供显着的价值。 如果你的东西是如此之好 – 以一个难以拒绝的价格 – 没有任何浪费时间和金钱来逆向工程的动机。 逆向工程是昂贵的。 让你的产品稍微便宜些。

  3. 提供升级和改进,使任何逆向工程一个坏主意。 当下一个版本打破他们的逆向工程时,没有意义。 这可以进行到荒谬的极端,但你应该提供新的function,使下一个版本比逆向工程更有价值。

  4. 提供定制化价格如此有吸引力,他们宁愿支付你build立和支持的增强。

  5. 使用过期的许可证密钥。 这是残酷的,会给你一个不好的名声,但它肯定会让你的软件停止工作。

  6. 提供它作为一个Web服务。 SaaS不涉及下载给客户。

Python不是你需要的工具

你必须使用正确的工具来做正确的事情,而且Python的devise不是被混淆的。 相反, 所有的东西都是开放的或容易在Python中显示或修改,因为这是语言的哲学。

如果你想要看不到的东西,寻找另一种工具。 这不是一件坏事,为不同的用途存在几种不同的工具是很重要的。

混淆真的很难

即使编译的程序也可以被反编译,所以不要以为你可以完全保护任何代码。 您可以分析混淆的PHP,打破闪存encryption密钥等新版本的Windows每次都被破解。

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

你不能防止别人滥用你的代码,但你可以很容易地发现是否有人这样做。 因此,这只是一个偶然的法律问题。

代码保护被高估

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

编译Python和分发二进制文件!

明智的想法:

使用Cython , Nuitka , Shed Skin或类似的东西来编译python到C代码,然后把你的应用程序作为python二进制库(pyd)来代替。

这样,没有任何Python(字节)代码被留下,我认为你已经做了任何合理数量的obscurification任何人(即你的雇主)可以期望从普通的代码。 (.NET或Java比这种情况更安全,因为字节码不会被混淆,并且可以相对容易地被反编译成合理的来源)。

Cython越来越与CPython兼容,所以我认为它应该可以工作。 (我正在考虑为我们的产品..我们已经build立了一些第三方库作为pyd / dll,所以运输我们自己的Python代码作为二进制文件对我们来说不是一个非常大的步骤。)

看到这个博客文章 (不是由我)的教程如何做到这一点。 (thx @hithwen)

疯狂的想法:

你可能可以让Cython分别为每个模块存储C文件,然后将它们连接在一起并用大量内联来构build它们。 这样,你的Python模块非常庞大,很难用普通的工具来完成。

超越疯狂:

如果您可以静态链接到(并优化)python运行时和所有库(dll),则可能可以构build单个可执行文件。 这样一来,拦截来自python的调用以及您使用的任何框架库肯定会很困难。 如果你使用LGPL代码,这是不能做到的。

我明白,你想让你的客户使用python的力量,但不想公开源代码。

这是我的build议:

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

(b)使用cython而不是Python

(c)在(a)和(b)中,应该可以将这些库作为许可二进制文件与Python接口一起分发。

您的雇主是否意识到他可以“窃取”其他人从您的代码中获得的任何想法? 我的意思是,如果他们能读懂你的作品,那他们也可以。 也许看看如何从这种情况中获益,将会使您的投资获得更好的回报,而不是担心会损失多less。

[编辑]回复Nick的评论:

没有增加,也没有丢失。 客户有他想要的(并且自己做了改变以后付钱)。 由于他没有公布这个变化,就好像它没有发生在其他人身上一样。

现在,如果客户销售软件,他们必须改变版权声明(这是非法的,所以你可以起诉,将赢得 – >简单的情况下)。

如果他们没有更改版权声明,二级客户会注意到这个软件来自你的原创,并且想知道发生了什么。 有机会,他们会联系你,所以你会知道你的工作转售。

我们再次有两种情况:原始客户只售出几份。 这意味着他们没有赚很多钱,所以为什么要麻烦。 或者他们销量大。 这意味着你有更好的机会了解他们所做的事情并做一些事情。

但最终,大多数公司都试图遵守法律(一旦声誉被破坏,做生意就难得多了)。 所以他们不会偷你的工作,而是和你一起去改进它。 因此,如果您包含源代码(使用可以保护您免于简单转售的许可证),那么他们很可能会推回他们所做的更改,因为这将确保更改在下一个版本中,而且他们不必维护它。 这是双赢的:如果他们真的需要改变,他们可以自己做出改变,即使你不愿意将其包含在正式版本中。

不要依赖混淆。 正如你已经正确的结论,它提供了非常有限的保护。 更新:这里是一个链接到在Dropbox反向工程混淆python代码的纸张 。 方法 – 操作码重新映射是一个很好的屏障,但显然它可以被击败。

相反,正如许多海报所提到的那样:

  • 不值得逆向工程时间(你的软件是如此之好,付出是有道理的)
  • 让他们签署合同,并在可行的情况下进行许可审计。

或者,像Python IDE WingIDE所做的那样: 放弃代码 。 这是正确的,给代码,让人们回来升级和支持。

在某些情况下,可能会将软件(全部或至less是关键部分)转移到您的组织托pipe的Web服务中。

这样,许可证检查可以在您自己的服务器机房中进行。

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

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

  1. 将一些关键的启动代码移到本地库中。
  2. 在本地库中执行许可证检查。

如果要删除对本地代码的调用,程序将无法启动。 如果没有删除,那么许可证将被强制执行。

虽然这不是一个跨平台或纯Python解决scheme,但它将工作。

根据客户的身份,简单的保护机制与合理的许可协议相结合将比任何复杂的授权/encryption/模糊处理系统更为有效。

最好的解决scheme是将代码作为服务销售,通过托pipe服务或提供支持 – 尽pipe这并不总是实用的。

将代码作为.pyc文件发送将会阻止你的保护被几个s挫败,但是这并不是有效的反盗版保护(就好像有这样的技术),而且在一天结束时,它不应该实现任何与公司有正当的许可协议的东西都可以。

专注于使您的代码尽可能好用 – 拥有高兴的客户将使您的公司远远超过防止一些理论上的盗版。

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

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

各种各样令人讨厌的技巧都可以通过这种方式来混淆成熟的黑客。 停止一堆noob黑客很容易。 亲黑客,你不可能击败。 但大多数公司不会让职业黑客的员工长时间想象(可能是因为事情被黑客攻击)。 但是,一些黑客已经遍地都是(看起来好奇的IT人员)。

例如,你可以在一个修改过的解释器中,允许它检查源代码中的某些注释或文档。 你可以有这样的代码行的特殊的OP代码。 例如:

OP 234是源代码行“#版权我写这个”或编译该行到相当于“如果错误:”如果“#版权”丢失的操作代码。 基本上禁用整个代码块似乎是一些模糊的原因。

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

我发现将源代码或操作代码留给眼球是有点矛盾的,但是对于networkingstream量使用SSL。 SSL也不是100%安全的。 但它被用来阻止MOST的眼睛阅读它。 一点点的预防措施是明智的。

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

另一个使你的代码更难以窃取的尝试是使用jython,然后使用java混淆器 。

这应该工作得很好,因为jythonc将python代码翻译为java,然后将java编译为字节码。 所以,如果你对这些类进行混淆,反编译之后真的很难理解,更不用说恢复实际的代码了。

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

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

用标准的encryptionscheme对你的代码进行签名,通过散列和签名重要文件并用公钥方法检查你的代码是什么?

通过这种方式,您可以为每个客户使用公钥来颁发许可证文件。

另外,你可以使用这样的python混淆器(只是用googlesearch)。

你应该看看getdropbox.com上的人是如何为他们的客户端软件(包括Linux)做的。 破解是非常棘手的,需要一些相当有创意的反汇编来超越保护机制。

用Python做的最好的事情就是掩盖事物。

  • 删除所有文档
  • 只分发.pyc编译的文件。
  • 冻结它
  • 在类/模块中隐藏常量,以使help(config)不显示所有内容

你也许可以通过encryption一部分并且dynamic解密并将其传递给eval()来添加一些额外的模糊处理。 但不pipe你做什么,都可以打破它。

这一切都不会阻止一个坚定的攻击者解散字节码或者通过帮助,dir等挖掘你的api。

有时间限制的许可证的想法,并检查它在本地安装的程序将无法正常工作。 即使完美的混淆,许可证检查可以被删除。 但是,如果您检查远程系统上的许可证,并在已closures的远程系统上运行大部分程序,则可以保护您的IP。

防止竞争对手使用源代码作为自己的代码,或者编写相同代码的启发版本,一种保护方法是向程序逻辑中添加签名(一些秘密能够certificate代码是从你手中窃取的),并混淆python源代码,所以很难阅读和利用。

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

这不会有助于防止黑客入侵您的程序。 即使使用混淆代码许可证的东西将被破解,程序可能会被修改,以具有稍微不同的行为(以同样的方式编译二进制代码不能保护本地程序)。

除了符号混淆之外,对于不需要代码的代码来说也许是个好主意,如果调用图表指向许多不同的地方,即使实际上这些不同的地方最终都是相同的东西,这也会使得一切变得更加混乱。

混淆代码中的逻辑签名(例如,您可以创build由程序逻辑使用的值的表格,也可以用作签名),这可以用来确定代码是否来自您。 如果有人决定使用你的模糊代码模块作为他们自己的产品的一部分(甚至在重新混淆后,使其看起来不同),你可以显示,该代码被盗用你的秘密签名。

我一直在为自己的项目研究软件保护,一般的理念是完全保护是不可能的。 唯一可以希望达到的目标就是将保护措施添加到可以让您的客户绕过而不是购买其他许可证的水平上。

这样说,我只是检查谷歌pythonobsfucation,而不是很多东西。 在.Net解决scheme中,obsfucation将成为您在windows平台上遇到的第一个问题,但我不确定是否有人在Linux上使用Mono。

接下来的事情就是用编译语言编写代码,或者如果你真的想要一路走下去,那就用汇编语言。 剥离出来的可执行文件比解释语言要难以反编译。

这一切都归结于权衡。 一方面,您可以轻松地使用python进行软件开发,隐藏秘密也很困难。 另一方面,用汇编语言编写的软件要难得多,但隐藏起来要容易得多。

你的老板必须在支持他的要求的连续体的某个地方select一个点。 然后他必须给你工具和时间,以便你可以build立他想要的东西。 然而我敢打赌,他会反对真正的开发成本与潜在的货币损失。

http://www.bitboost.com提供了一个Python混淆器。; 充分披露:作者是我的朋友。

py2exe字节码可以放在加载并执行内存的C启动程序的encryption资源中。 这里和这里的一些想法。

有些人也想到一个自我修改的程序 ,使逆向工程昂贵。

您还可以find防止debugging器的教程 ,使反汇编程序失败,设置错误的debugging器断点并用校验和保护您的代码。 search[“encryption码”在内存中执行“]以获取更多链接。

但正如其他人所说,如果你的代码是值得的,反向工程师最终会成功。

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

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

它在Ubuntu的仓库中可用

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

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

使用Cython保护Python源代码