如何防止反编译或检查 python 代码?

Posted

技术标签:

【中文标题】如何防止反编译或检查 python 代码?【英文标题】:How to prevent decompilation or inspecting python code? 【发布时间】:2011-09-17 10:38:22 【问题描述】:

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

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

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

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

快速浏览 Python 的文档发现了一种以这种方式抑制 inspect 模块导入的方法:

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

是否彻底解决了问题?

【问题讨论】:

对于您的最后一个答案,我仍然可以:del sys.modules['inspect'] :) 相关:***.com/questions/261638/how-do-i-protect-python-code 不可能。 但是——看看this answer,它建议使用 Cython。当然,任何东西都可以逆向工程,但是由于 Cython 生成的 c 代码编译成机器代码,因此逆向工程可能与用 c 编写的任何东西一样难。 而不是“保持[ing] Python 密码的秘密”,您应该这样做,以便 Python 代码一开始就不需要是秘密的。正如 Sven 链接的问题的答案中所建议的那样,将敏感代码放在扩展模块中并在 Python 脚本中使用它比试图隐藏用不是为隐藏而设计的语言编写的代码要好。 @mouad - 啊啊啊! :D 聪明! :D 【参考方案1】:

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

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

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

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

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

【讨论】:

他们会得到变量名。由于所有这些都可以在运行时进行自省,因此它们都存在于字节码中。【参考方案2】:

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

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

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

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

【讨论】:

我提出的问题源于纯粹的好奇。项目不是我的创作,我是提到的用户之一。事实上,我非常感谢完整记录的公共 API 来扩展 Project 的功能。据我所知 - Project 的开发人员和另一家公司之间有一项商业协议,以适应和集成可视化的模块化脚本语言,作为扩展包的一种形式,显然 - 确实要花一分钱。为了尊重开发者的利益,我特意不提项目名称。【参考方案3】:

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

没有。

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于如何防止反编译或检查 python 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止代码被反编译

如何防止Unity3D代码被反编译

c#如何防反编译

如何防止Unity3D代码被反编译

如何防止Android程序被反编译

如何防止Unity3D代码被反编译