编译器构造-通过解释器突变混淆python字节码



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

我听了Giovanni Bajo(PyInstaller创始人)的一次会议,他说Dropbox是这样做的:

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

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

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

更新:

我对Dropbox如何进行这种类型的混淆/突变进行了一些研究,我发现:

根据Hagen Fritsch的说法,他们分为两个阶段:

  1. 他们使用TEA密码以及由每个python模块的代码对象。他们调整了翻译从而使其

    a) 解密模块和

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

    这将是一条简单的路径,只需让dropbox解密所有内容,并使用内置的marshaller转储模块。

  2. 使用的另一个技巧是对操作码进行手动加扰。不幸的是,这只能半自动地解决,因此他们单字母替换密码在术语上被证明是相当有效的赢得一些时间。

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

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

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

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


我不知道在这个过程中解密是怎么发生的。。。

您可以修改解释器中导入模块的部分,并在其中插入解密C代码。

最新更新