2011-06-17 43 views
4

让我们假设有一个大的商业项目(a.k.a项目),它使用引擎盖下的Python来管理插件,以配置可以附加和使用Project的新控制界面。如何防止反编译或检查python代码?

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

更进一步,使用inspect模块和raw __dict__读数,人们能够找到Project的基础Python实现的主要部分。

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

快看看Python的文档透露了一个办法suppres inspect模块的导入是这样的:

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

它是否已完全解决这个问题?

+4

对于你最后的回答,我仍然可以这样做:'del sys.modules ['inspect']':) – mouad

+3

相关:http://stackoverflow.com/questions/261638/how-do-i-protect-python-代码 –

+1

不可能。 _But_ - 看看[这个答案](http://stackoverflow.com/questions/576963/python-code-obfuscation/577161#577161)它建议使用Cython。当然,任何东西都可以被反向设计,但是由于Cython生成的c代码被编译成机器代码,所以可能很难像c中编写的任何东西那样反向工程。 – senderle

回答

9

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

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

请注意,此过程也可以使用编译语言代码完成;不同的是你会得到装配。有些工具可以从程序集中推断C结构,但我没有足够的经验来评论细节。

你试图隐藏什么特定的信息?你可以保留算法服务器端,并让你的软件进入一个接触你的Web服务的客户端吗?将代码保存在您控制的机器上是真正控制代码的唯一方法。您不能将某个锁定的盒子和盒子的钥匙交给某人,并且在他们必须打开盒子以便运行时才能打开盒子。这与DRM不起作用的原因相同。

尽管如此,仍然有可能使其进行逆向工程,但当客户端具有可执行文件时,它永远不可能。

+0

他们将获得变量名称。由于所有这些都可以在运行时进行内省,因此它都存在于字节码中。 –

+0

@Ned Batchelder:更新,谢谢! – Daenyth

4

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

不,没有。

Python是特别容易反向工程,但其他语言,甚至编译的,很容易反向。

1

你不能完全防止软件的逆向工程 - 如果它归结为它,总是可以分析你的程序组成的汇编程序指令。

但是,您可以使该过程显着复杂化,例如通过搞乱Python内部。但是,在跳到之前如何这样做,我建议你评估是否来做到这一点。通常很难“窃取”你的代码(毕竟,我们需要完全理解它们才能扩展它们),而不是自己编写代码。然而,一个纯粹的,未混淆的Python插件接口对于为您的程序创建一个完整的生态系统至关重要,远远超过了让某人偷看您的可能不是完美设计的编码内部部件的可能缺点。

7

没有办法让应用程序代码保持绝对的秘密。坦白地说,如果一群专心致志的黑客(在良知意义上而不是贬义意义上)可以破解PlayStation的代码签名安全模型,那么你的应用就没有机会。一旦将您的应用程序交给公司外的人员使用,它可以进行反向设计。

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

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

+0

+1有关商业模式的评论。 –

+0

问题我问起源于纯粹的好奇心。项目不是我的创作,我是提到的用户之一。事实上,我将非常感谢充分记录的公共API来扩展Project的功能。 据我所知 - 项目的开发人员和另一家公司之间达成了一项业务协议,以适应和集成视觉模块化脚本语言,作为一种扩展包形式,显然这确实花了一分钱。 我故意不提项目的名称来尊重开发者的利益。 – Helbreder