不可反编译的Python

-2 投票
2 回答
1995 浏览
提问于 2025-04-17 17:10

可以对 .pyc 文件进行反编译:反编译 Python 2.7 的 .pyc 文件

有没有办法把 Python 文件编译成一种人类看不懂的代码,就像 c++ -> exe 这样的二进制文件?也就是说,不像明文的 .py 文件和 很容易被恢复 的 .pyc 文件?(我不在乎如果它可以被暴力破解)

2 个回答

3

任何有代码加密的系统都可能被攻击,因为解密的钥匙总是会在某个地方存在。

所以,这其实只是一个付出努力的问题。

8

Python是一种非常灵活的编程语言,支持很多不同层次的自我检查功能。因此,想要让Python的字节码变得难以理解,真的是一项非常艰巨的任务。

而且,你嵌入的Python解释器仍然需要能够执行你随产品一起发布的字节码。如果解释器能访问字节码,那么其他人也能访问。加密也没什么用,因为你自己还是需要解密字节码,然后其他人就能从内存中读取字节码。混淆代码只是让默认工具使用起来更困难,并不是不可能。

话虽如此,下面是一些让你的应用程序的Python字节码变得非常难以阅读的方法:

  • 给所有的Python操作码(opcode)值重新分配一个新的值。重新连接整个解释器,让不同的操作码使用不同的字节值。

  • 尽可能去掉所有的自我检查功能。你的函数需要有闭包,代码对象仍然需要常量,但可以忽略代码对象中的局部变量列表。例如,去掉sys._getframe()函数,削减追踪信息。

这两个步骤都需要深入了解Python解释器的工作原理,以及Python对象模型是如何组合在一起的。你很可能会引入一些难以解决的错误。

最后,你得问问自己,这样做值不值得。一个有决心的黑客仍然可以分析你的字节码,进行一些频率分析来重建操作码表,或者给你的程序输入不同的操作码看看会发生什么,从而破解所有的混淆。一旦创建了翻译表,反编译你的字节码就变得非常简单,重建你的代码也不远了。

如果你只是想防止字节码文件被修改,可以在你的.pyc文件中嵌入校验和,并在启动时检查这些校验和。如果不匹配就拒绝加载。虽然有人会修改你的二进制文件以去掉校验和检查或替换校验和,但你至少不需要花费太多精力来提供一些基本的防篡改保护。

撰写回答