6

让我们假设有一个大型的商业项目(又名 Project),它在后台使用 Python 来管理插件,以配置可以被 Project 附加和使用的新控制界面。

有一个小信息泄漏,项目的 Python API 的某些部分泄露给了公共信息,人们能够编写 Python 脚本,这些脚本被底层 Python 实现调用,作为项​​目插件加载机制的一部分。

进一步,使用inspect模块和原始__dict__读数,人们能够找出 Project 底层 Python 实现的主要部分。

有没有办法让 Python 密码保密?

快速查看 Python 的文档揭示了一种以inspect这种方式抑制模块导入的方法:

import sys
sys.modules['inspect'] = None

能彻底解决问题吗?

4

4 回答 4

12

不,这并不能解决问题。有人可以将检查模块重命名为其他内容并将其导入。

你试图做的事情是不可能的。python 解释器必须能够获取您的字节码并执行它。总有人能够反编译字节码。他们将始终能够生成 AST 并查看带有变量和类名的代码流。

请注意,此过程也可以使用编译的语言代码来完成;不同之处在于您将获得组装。一些工具可以从程序集中推断 C 结构,但我没有足够的经验来评论细节。

您要隐藏哪些具体信息?您能否保留算法服务器端,并将您的软件变成接触您的 Web 服务的客户端?将代码保存在您控制的机器上是真正控制代码的唯一方法。你不能给某人一个上锁的盒子,盒子的钥匙,并阻止他们在必须打开盒子才能运行它时打开它。这与 DRM 不起作用的原因相同。

话虽如此,逆向工程仍然有可能变得困难,但当客户端拥有可执行文件时,这绝不是不可能的。

于 2011-06-17T19:01:30.223 回答
9

没有办法让您的应用程序代码绝对保密。

坦率地说,如果一群敬业而坚定的黑客(从好的意义上说,不是贬义的)可以破解 PlayStation 的代码签名安全模型,那么您的应用程序就没有机会了。一旦您将您的应用程序交到公司以外的人手中,就可以对其进行逆向工程。

现在,如果你想努力让它变得更难,你可以编译你自己的嵌入式 python 可执行文件,去掉不必要的模块,混淆编译的 python 字节码,并将其包装在一些恶意软件 rootkit 中,如果调试器拒绝启动你的应用程序在跑。

但是你真的应该考虑你的商业模式。如果您认为对您的产品充满热情的人是一种威胁,如果您认为那些愿意花时间和精力来定制您的产品以个性化他们的体验的人是一种危险,那么您可能需要重新考虑您的安全方法. 假设您不从事 DRM 业务,或者有类似的模式涉及从不情愿的消费者那里榨取资金,请考虑开发一种涉及与用户共享信息并允许他们协作改进您的产品的方法。

于 2011-06-17T19:25:19.360 回答
4

有没有办法让 Python 密码保密?

不,那里没有。

Python 特别容易进行逆向工程,但其他语言,即使是编译的语言,也很容易逆向。

于 2011-06-17T19:02:16.767 回答
1

您不能完全阻止软件的逆向工程——如果归根结底,人们总是可以分析您的程序所包含的汇编指令。

但是,您可以使该过程显着复杂化,例如通过弄乱 Python 内部结构。但是,在跳到如何做之前,我建议您评估是否要这样做。通常,“窃取”您的代码(毕竟,需要完全理解它们才能扩展它们)比自己编写代码更难。然而,一个纯粹的、未混淆的 Python 插件界面对于围绕您的程序创建一个完整的生态系统至关重要,这远远超过了有人窥视您可能设计不完美的编码内部结构可能带来的不利影响。

于 2011-06-17T19:05:45.463 回答