通过解释器变异模糊python字节码

sec*_*rve 6 python compiler-construction ctypes packaging cpython

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

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

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

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

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

更新:

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

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

  1. 它们使用TEA密码以及每个python模块的代码对象中的某些值播种的RNG.他们相应地调整了解释器

    a)解密模块和

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

    这将是直接的路径,让dropbox解密所有内容并使用内置marshaller转储模块.

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

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

Jan*_*ila 2

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

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

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


我不知道这个过程中解密是如何发生的......

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