如何防止反编译或查看Python代码?
假设有一个大型的商业项目(我们称之为“项目”),它在后台使用Python来管理插件,这些插件可以用来配置新的控制界面,这些控制界面可以连接并被项目使用。
最近发生了一次小规模的信息泄露,项目的某些Python接口信息被泄露到公众,结果人们能够编写Python脚本,这些脚本会被项目的插件加载机制调用。
接着,利用inspect
模块和原始的__dict__
读取,人们发现了项目底层Python实现的很大一部分内容。
有没有办法让Python的秘密代码保持秘密呢?
快速查看Python的文档发现,有一种方法可以抑制inspect
模块的导入,具体方法如下:
import sys
sys.modules['inspect'] = None
这样做能完全解决问题吗?
4 个回答
有没有办法让Python的秘密代码保持秘密呢?
没有办法。
Python特别容易被破解,也就是说别人很容易看懂你的代码。不过其他语言,即使是编译过的,也还是比较容易被破解。
其实,没有办法让你的应用代码完全保密。
坦白说,如果一群专注且有决心的黑客(这里是指善意的黑客,不是贬义的那种)都能破解PlayStation的代码签名安全系统,那么你的应用就更没机会了。一旦你把应用交给公司外的人,他们就可以对它进行逆向工程,也就是分析和理解你的代码。
当然,如果你想花点力气让破解变得更难,你可以自己编译一个嵌入式的Python可执行文件,去掉不必要的模块,混淆编译后的Python字节码,然后把它包裹在一些恶意软件的根工具包里,这样如果有调试器在运行,就不让你的应用启动。
不过,你真的应该考虑一下你的商业模式。如果你把那些热爱你产品的人视为威胁,把愿意花时间和精力来定制你产品以提升体验的人看作危险,或许你需要重新思考一下你的安全策略。假设你不是在做数字版权管理(DRM)这类的事情,或者没有类似的模式来从不情愿的消费者身上榨取钱财,那就考虑发展一种与用户分享信息的方式,让他们能够共同改进你的产品。
不,这样做并不能解决问题。有人可以把inspect模块改个名字,然后再导入它。
你想做的事情是不可能的。Python解释器必须能够读取你的字节码并执行它。总会有人能够反编译字节码,他们总能生成抽象语法树(AST),并查看代码的流程,包括变量和类的名称。
需要注意的是,这个过程也可以应用于编译语言的代码;不过那里的区别是你会得到汇编代码。有些工具可以从汇编代码中推断出C语言的结构,但我对这方面的经验不够,无法详细评论。
你具体想隐藏什么信息呢?你能不能把算法放在服务器上,让你的软件变成一个客户端,去访问你的网络服务?把代码保存在你控制的机器上,才是保持对代码真正控制的唯一方法。你不能把一个锁着的箱子和箱子的钥匙交给别人,然后还想阻止他们打开箱子,因为他们必须打开它才能运行。这就是数字版权管理(DRM)无法奏效的原因。
不过,尽管如此,还是可以让反向工程变得困难,但当客户端拥有可执行文件时,这永远不可能做到完全不可能。