保护Python代码免受逆向工程的影响

4
我正在使用Python(2.7)编写程序,并希望保护它免受逆向工程的影响。我使用了cx_freeze进行编译(提供基本的安全性-混淆和反调试)。如何添加更多保护措施,例如混淆、打包、反调试、加密代码以识别虚拟机?我想过在运行时加密有效载荷并解密,但我不知道该如何实现。

1
每台计算机上的锁都有漏洞,所以为什么要实现一个昂贵且最终会被破解的安全措施呢? - user2740652
你究竟想要实现什么? - fuz
2
如果您想实现某种混淆,我建议您使用一种在运行时不需要知道符号名称的编程语言(Python需要)。 - fuz
我将稍微评估一下你的编程技能,从“...在运行时解密它,但是我毫无头绪...”。我的结论是,如果你的代码只是一个相当普通的应用程序,那么你可能不需要担心有人会试图窃取它。很可能存在更好的应用程序。所以过多地努力保护方案只是浪费时间,做一些基本的保护就可以了。也许你是某个非编程领域的专家,从那里带来了宝贵的知识 - 那么担心是可以理解的,我可以理解你为什么想要保护它,但这很困难。:/ - Ped7g
如果你真的想制作一个不会被破解的程序,那么你需要阻止人们这样做。让第一步变得异常困难,以至于他们放弃。逐步取得微小的进展会给予很多继续下去的动力。 - Walter
3个回答

8

一般来说,只要黑客有足够的动机,你的程序几乎不可能做到无法破解。

但是你可以让它更难被反向工程,尝试使用cython将核心代码编译成pydso文件。


1
这会让它更难吗?使用Cython,您可以获得机器代码,我认为这使得它更加“容易”,不是吗? - z0rberg's
10
我认为相对而言,理解Python代码比机器代码更容易。 - Shane
这在一定程度上是正确的,当涉及到编译后的Python字节码时,这一点更为真实。我希望他在分发时使用的是编译后的字节码,而不是纯粹的源代码。因为当代码是纯粹的机器码时,我认为会更容易,因为中间没有CPython的存在。另一方面,Python调试器也存在,但很可能比机器码调试器容易被欺骗。 - z0rberg's
黑客有足够的动机去攻击Windows操作系统代码吗?!请记住,它从未被破解过。所以我同意一切都是可被攻击的,只是需要付出努力。但是有方法可以做到这一点,在SO上我不认为有人足够聪明能够给你如何做的指示。 - Module_art

5

现在没有办法使任何数字内容变得安全。

你能做的是让它变得难以处理到令人沮丧的程度,但我承认我不知道 Python 具体实现这一点的方法。程序的安全性并不仅仅与代码的安全性有关,更重要的是心理因素。

没错,就是心理因素。

考虑到黑客和反黑客之间的竞赛,两者都在不断尝试超越对方,我们唯一能做的就是尽可能地增加对方的烦恼。怎么做到呢?

压制对方!

每多添加一步骤来确保您的代码难以破解,都是一个好的选择。

例如,您可以将程序转换为单个编译后的字节块,并从程序内部调用该块。使用外部库事先加密它并在之后解密它。 对于函数的代码块也可采取同样的额外步骤。或者,准备好预编译的函数块,但是将其打乱。在运行时,利用 byteplay,根据不同功能的其他字节修复字节码,这会在修改代码时阻止程序正常工作。

有很多方法来搞乱人们的头脑,虽然我不能告诉你任何 Python 具体的方法,但如果你从“如何变得困难”这个角度思考,你会找到最奇怪的方式来搞乱代码。

有趣的是,在汇编语言中做这件事比在 Python 中简单得多,所以也许你应该研究一下通过 ctypes 或其他方式执行外部代码。

召唤您内心的巨魔吧!


3
为什么被踩了?你有没有挑战过别人来破解你的密码?我曾经尝试过,这是一种思维游戏。 - z0rberg's
也许说“现在没有任何数字内容是安全的”有些言过其实了? - zaph
1
你是否计算从未连接网络、从未使用USB、CD、DVD的电脑?有软件成功地针对空气隔离进行攻击!马克·扎克伯格遮盖他电脑的摄像头。没有任何数字设备是安全的。当然,你可以把硬盘放在保险箱里,但那有什么意义呢? :) - z0rberg's
1
HSMs中的密钥永远不会离开其中。在iMessages的情况下,苹果公司使用混合器对管理员卡进行哈希处理,因此即使他们没有访问权限也无法获得。还要考虑Whisper系统。Signal由Open Whisper Systems提供。仅供娱乐,我的CISSP认为这是一种夸张。 - zaph
谢谢,我会查一下的! - z0rberg's
2
通常情况下,安全性是关于增加攻击者的工作因素。我们需要考虑攻击者(从资金充足的国家到新手黑客)以及被攻击事物的价值(从核启动密码到奶奶的秘方菜谱)。我们需要了解这些并相应地设计。 - zaph

3
故事时间:我是一名长期从事Python编程的程序员。最近,我加入了一家公司,担任Python程序员。我的经理是一名Java程序员,我猜他已经从事这个行业十年了。在初步评估时,他问我是否在混淆代码?我回答说,在Python中我们不会做这种事情。他说,在Java中我们会这样做,我们希望在Python中也实现同样的功能。最终,我设法混淆代码(只需删除注释和空格并重命名本地变量),但整个Python调试过程变得混乱了。
然后他问我,我们可以使用ProGuard吗?我不知道它到底是什么。经过一些搜索,我说它是用于Java的,不能在Python中使用。我还说,无论我们构建什么,我们都部署在自己的服务器上,所以我们实际上不需要保护代码。但他不愿意,说我们有一套流程,必须在部署之前遵循。
最终,我在一年后辞职了,因为厌倦了为说服他们Python不是Java而战。那时,我也没有兴趣让他们改变想法。
简而言之,由于Python的开源性质,没有可行的工具可用于混淆或加密您的代码。只要您在自己的服务器上部署代码(提供软件作为服务),我认为这不是一个问题。但如果您实际上向客户提供产品,则有一些工具可用于包装您的代码或字节码,并像可执行文件一样提供它。但如果他们想,他们总是可以查看您的代码。或者,如果绝对需要保护您的代码,则选择其他提供更好保护的语言。请记住,对代码进行反向工程始终是可能的。

尝试使用 PyArmor 或 Cython。 - JJ_Coder4Hire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接