python - 通过解释器变异混淆 python 字节码

标签 python compiler-construction ctypes packaging cpython

实际上,Dropbox 做得很好,他们能够保护他们用 python 制作的桌面应用程序;我对此进行了很多研究,但没有比混淆更好的解决方案了,这不是很安全的方法,你最终会看到你的代码上传到某处。

我听过 Giovanni Bajo(PyInstaller 的创始人)的一次演讲,他说 Dropbox 是这样做的:

  1. 通过重新编译 CPython 的解释器进行字节码加扰,以及 这样,标准的 CPython 解释器将无法运行它, 只有重新编译的 cpython 解释器。
  2. 您需要做的就是将定义下面的数字打乱 加载 8

我从来没有看过Python的源代码,所以,我不会声称我完全理解上面的话。

我需要听听专家的声音:如何做这样的事情?如果在重新编译后我将能够使用 PyInstaller 等可用工具打包我的应用程序?

更新:

我对 Dropbox 如何进行这种混淆/变异进行了一些研究,我发现了这一点:

根据 Hagen Fritsch ,他们分两个阶段进行:

  1. 他们使用 TEA 密码以及由 每个 python 模块的代码对象。他们调整了翻译 因此,它

    a) 解密模块和

    b) 防止访问解密的代码对象。

    如果让 dropbox 解密所有内容并使用内置编码器转储模块,这本来是最直接的途径。

  2. 使用的另一个技巧是手动加扰操作码。 不幸的是,这只能半自动修复,因此他们 单字母替换密码证明在术语方面非常有效 赢得一些时间。

我仍然想要更多关于如何做到这一点的见解,而且,我不知道解密是如何在这个过程中发生的......我想要所有专家的声音......普通人你在哪里。

最佳答案

我想这是关于打乱 include/opcode.h 中的数字。不过,我在那里没有看到 #define loadup,但也许它指的是一些旧的 Python 版本。我没试过这个。

这将混淆您的 .pyc 文件,以便它们无法被任何识别正常 .pyc 文件的工具检查。这可能会帮助您在程序中隐藏一些安全措施。但是,攻击者可能(例如)从您的应用程序包中提取您的自定义 Python 解释器并利用它来检查文件。 (只需启动交互式解释器并通过在模块上导入和使用 dir 来开始调查)

另请注意,您的包肯定会包含一些来自 Python 标准库的模块。如果攻击者猜测您已经打乱了操作码,他可以在您的版本和标准模块的正常版本之间进行逐字节比较,并以这种方式发现您的操作码。为了防止这种简单的攻击,可以通过适当的加密来保护模块,并尝试在解释器中隐藏解密步骤,如更新后的问题中所述。这迫使攻击者使用机器代码调试来寻找解密代码。


I don't know how the decryption happens in this process...

您将修改导入模块的解释器部分,并在那里插入您的解密 C 代码。

关于python - 通过解释器变异混淆 python 字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14997414/

相关文章:

Python ctypes返回一个函数指针数组

python - 使用大量内存将类定义为枚举

python - 如何删除所有子元素?

parsing - 语义分析器的构建

python - 访问 C 初始化的 ctypes 结构元素时出现段错误

python - 使用 ctypes 处理 128 位整数

对于公共(public)方法,Python 模拟补丁无法按预期工作

python - 在 Python 中使命令行参数可选

c++ - 通过 C/C++ 编译和编译器错误/限制

用于最小可执行文件的 C++ Windows 编译器