保护在 Python 上运行的 .exe 程序源代码的最佳方法?

逆向工程 反编译 C Python 混淆 可执行
2021-07-02 06:58:03

我正在开发将以 .exe 文件形式分发的专有软件。为了使用它,用户必须使用他们的白名单凭据(用户名 + 密码)进行身份验证。

我遇到的问题是,在我销售的行业中,有很多“黑客”会尝试反编译您的可执行文件,获取源代码并将其免费分发给其他人。

为了对抗这些逆向工程尝试,我尝试混淆我的代码并使用各种编译器,但到目前为止都没有成功。

我尝试过的:

  • 使用py2exe编译器:“黑客”设法在一小时内反编译了可执行文件。
  • 使用pyinstaller编译器:与py2exe.
  • 使用pyminifier混淆代码:“黑客”成功地反混淆代码。
  • 用途Oxyry Python Obfuscator:与使用相同pyminifier

那些设法对我的程序进行反编译和反混淆的人解释说,这 4 个工具的开源性质意味着它们的算法是众所周知的,并且有一些解决方案可以对使用这些开源编译器和混淆器的程序进行逆向工程。

我还没有尝试的:

  • 使用Pyarmor混淆我的代码。我听说它很好,但要 50 美元,所以我想在购买许可证之前确定它是最好的混淆工具。
  • 使用Cython库为我的程序创建一个 C 包装器,使其用 C 而不是 Python 编译。由于 C 二进制文件更难阅读,这将使程序更难反编译。但是,我从来没有用 C 编程,我想知道是否有更好的方法来编译我的源 Python 代码,而无需学习 C。
  • 使用VMProtect,Enigma ProtectorThemida/Code Virtualizer每个工具的成本都超过 150 美元,所以在购买它们之前,我想知道这是否是解决我问题的最佳方法。

我不会尝试的:

  • 用 Python 以外的语言完全重写我的整个程序。我不擅长其他语言,加上程序本身由 5,000 多行代码组成,所以我不能仅仅为了使它更难反编译而完全重写它。
  • 使程序开源:这是一个营利性软件,所以我不打算发布专有代码,感谢您的理解。
  • 使程序成为网络应用程序:由于我的程序直接与用户 PC 上的文件交互,因此我无法使其基于网络,必须在用户 PC 上。

还请注意,如果“黑客”能够在不访问源代码的情况下禁用白名单系统,他将能够不受限制地将其分发给其他用户。因此,我正在寻找一种方法,它不仅会使反编译程序变得极其困难,而且几乎不可能干预字节码/二进制文件并关闭程序代码的某些部分。

1个回答

有一些方法可以使 Python 程序难以进行逆向工程。它是可能的,但您需要摆弄Python 源代码(用 C 编写)并为您的目的编译一个特殊的构建。

Python 的工作方式是完整记录和开源的。例如,考虑 pyc 文件格式。处理读取/写入 pyc 的大部分代码都可以在marshal.c 中找到。如果您修改代码并重新排序读取/写入对象的顺序,您可以轻松摆脱反编译器。为了进一步加强保护,您可以对仅在运行时解密的字节码进行加密。

另一种常用的技术是操作码重映射。Python 中的字节码指令集可以在opcode.h 中找到

考虑这两个指令

#define DUP_TOP_TWO               5

#define BINARY_TRUE_DIVIDE       27

您可以交换这些指令的操作码。因此,只有您的自定义 Python 构建才能理解字节码。

Dropbox 的早期版本是用 Python 开发的,他们使用了上述一些技术来强化他们的代码,但与任何 DRM 系统的情况一样,它最终被逆向工程和分析。此过程的记录,您可以研究以供进一步参考。(免责声明:我是这篇文章的作者,但不是 GitHub 存储库的所有者)。