这个问题与另一个问题有关。我只是想知道适用于哪些技术,在现实世界中可以找到哪些技术来混淆Python程序(在这里和这里的stackoverflow上可以找到类似的问题)。

mikeazo提到了他的程序是提供了自定义的Python解释器,但是其他技术又有哪些呢?它们的效率如何?

#1 楼

以下是使用自定义解释器打包python应用程序时可以使用的技巧。


重新映射解释器的操作码
加密pyc文件(自定义解释器在导入之前先解密)
删除对解释器中co_code的访问(删除解释器的codeobject.c中code_memberlist数组声明中对co_code的引用)
混淆/保护python解释器
请勿捆绑诸如dis,这将有助于进行逆向工程(基本上对一个模糊的python程序进行逆向工程,注意您发现有用的所有模块/技术,并将其从自定义解释器中删除)
修改解释器,使其只能导入pyc文件(可以完成通过删除编译模块或在解释器中进行过滤)。
pyREtic人士提供了一些用于输入自定义解释器的标准技术。在您的应用上测试这些代码并尝试禁用这些访问方法会使反向工程师更加困难。
从解释器中删除RE可以调用以帮助他/她的函数,例如PyRunString()。否则,他们可以附加调试器并运行任意python代码。

参考文献




pyREtic – Rich进行的内存反向工程,用于混淆的Python字节码史密斯DEFCON-18,拉斯维加斯,2010年。


评论


只要您遵循这条路线,还可能使解释器要求对所有代码进行签名。

–锑
13年5月1日14:14

另外,还可以查看“(下拉)框内的外观”,因为它是商业包装的Python应用程序。 usenix.org/system/files/conference/woot13/woot13-kholia.pdf

– Stolas
2013年9月4日在6:29

#2 楼

我不知道任何特定的Python混淆工具(可能是因为想要编写混淆代码的人不会在Python中这样做,除了娱乐/教育之外)。

但是,如果确实需要混淆Python代码,则可能会使用与任何语言的程序相同的技术。缺少工具意味着您需要编写自己的混淆器,但这并不困难。

基本上,想想要对程序进行反向工程并对其进行转换以使其变得更困难的任何操作。


使不变量变得复杂。将程序不变式转换为类似“(x ** y)%p == 457”或“此数据结构表示一个手形图”之类的东西。静态或动态分析工具很难猜出这种不变量,因此人类需要花费很多时间才能弄清楚。
将不同方法的逻辑混合在一起。采取一切好的设计实践,然后做相反的事情。将方法的各部分随机内联到其他方法中,然后重新排列代码。 CFG的重复部分,并在两个版本的对应点之间随机插入跳转,然后对其进行变异,以使它们显然不是重复的。
添加一个打包程序。如果仅在实际需要执行代码时才解密部分代码,并使结果取决于程序状态,则可以使用额外的指针,因此很难预先确定密钥。尝试确保原始程序永远不会出现在内存中。

混淆的主要挑战在于,它需要了解程序,通常会损害性能。更极端的混淆仅适用于性能无关紧要且经受严格审查很重要的情况(即恶意软件)。

评论


除了混淆代码之外,问题还在于尝试强制执行应用程序许可和到期。在这种情况下,我建议将应用程序的某些关键部分移至本机二进制文件(即用C编写),然后在其中进行许可证检查。当然,可以以“标准”方式保护该C共享库/ dll。

–0xea
13年5月1日,9:07

#3 楼

我认为来自SO的这些问题可能会有所帮助:

使Python代码变得混乱?

我如何保护Python代码?

Python代码混淆

#4 楼

这个免费的工具将混淆多模块Python源代码,同时保留从第3方库导入的标识符。另外,其他标识符也可以免于混淆。我将其用于多年项目中,但决定其他人也可以从中受益。

评论


尝试运行混淆后的代码时出现“ SyntaxError:Unicode字符串中的编码声明”。它还会导入sys,在某些环境下可能会阻止它。这样的工具不应添加依赖项。

–悬挂
17年4月13日在17:22

#5 楼

您有一些选择。

您可以创建自己的包含现有加密工具的混淆方法...即openssl。但是请注意,完成此类项目可能需要花费大量时间。

它要求您绘制出如何将混淆代码中的“密码/密码”括起来的方式,除了您之外,没有人可以使用它。如果您连它都做不到,那将是更好的选择。

然后,您需要添加一些逻辑,这将导致脚本保护自己免受那些可能试图撬开该脚本的好奇的用户的攻击。同样重要的是,您想出的任何方法都不得显着增加脚本的执行时间。

这听起来似乎是不可能的,但我认为它是可行的。您只需要有动力,就可以拥有足够的时间。

或者,如果需要快捷方式,可以尝试将基于unix的示例python脚本粘贴到此站点,看看是否可以破坏他们的代码并公开您的“隐藏”代码。