通过解释器变异混淆Python字节码
其实,Dropbox做得非常好,他们成功地保护了用Python制作的桌面应用程序。我对此进行了很多研究,但没有找到比混淆更好的解决方案,而混淆并不是一个很安全的方法,最终你可能会发现你的代码被上传到某个地方。
我听过Giovanni Bajo(PyInstaller的创始人)的一场讲座,他提到Dropbox是这样做的:
- 通过重新编译CPython解释器来打乱字节码,这样标准的CPython解释器就无法运行它,只有重新编译的CPython解释器才能运行。
- 你需要做的就是打乱
define loadup 8
下面的数字。
我从来没有看过Python的源代码,所以我不能说我完全理解上面的内容。
我需要听听专家的意见:怎么才能做到这一点?而且在重新编译后,我能否使用像PyInstaller这样的工具打包我的应用程序?
更新:
我对Dropbox是如何进行这种混淆/变换的进行了研究,发现了以下内容:
根据Hagen Fritsch的说法,他们分两个阶段进行:
他们使用TEA加密算法,并结合由每个Python模块的代码对象中的一些值生成的随机数生成器(RNG)。他们相应地调整了解释器,以便:
a) 解密模块,
b) 防止访问解密后的代码对象。
这本来是一个简单的路径,只需让Dropbox解密所有内容并使用内置的序列化器导出模块。
另一个使用的技巧是手动打乱操作码。不幸的是,这只能半自动地修复,因此他们的单字母替换密码在争取时间方面非常有效。
我仍然想了解更多关于如何做到这一点的细节,此外,我不知道在这个过程中解密是如何进行的……我希望所有专家都能参与讨论……大家快来吧,你们在哪里。
1 个回答
我想这段话是关于在 include/opcode.h
文件中打乱数字的事情。不过,我没有看到 #define loadup
这个定义,可能是指某个旧版的Python。我没有尝试过这个。
这样做会让你的 .pyc
文件变得模糊不清,任何能识别普通 .pyc
文件的工具都无法查看。这可能有助于你隐藏程序中的一些安全措施。不过,攻击者可能会从你的应用包中提取出你自定义的Python解释器,然后利用这个解释器来检查文件。(只需启动交互式解释器,导入模块并使用 dir 命令进行调查)
另外,你的包肯定会包含一些来自Python标准库的模块。如果攻击者猜到你打乱了操作码,他可以逐字节对比你版本和标准模块的正常版本,从而发现你的操作码。为了防止这种简单的攻击,可以用适当的加密来保护模块,并尝试在解释器中隐藏解密步骤,正如更新的问题中提到的那样。这会迫使攻击者使用机器代码调试来寻找解密代码。
我不知道这个过程中的解密是怎么进行的……
你需要修改解释器中导入模块的部分,并在那里面插入你的解密C代码。