1

The reason I want to this is I want to use the tool pyobfuscate to obfuscate my python code. Butpyobfuscate can only obfuscate one file.

4

4 回答 4

1

我已经分别回答了您的直接问题,但是让我为我怀疑您实际尝试做的事情提供不同的解决方案:

无需发送混淆的源代码,只需发送字节码文件。这些是.pyc自动创建、缓存和使用的文件,但您也可以仅使用compileall标准库中的模块手动创建它们。

可以很好地导入缺少.pyc文件的文件。.py它不是人类可读的。它当然可以被反编译成 Python 源代码,但结果是……与在原始源代码上运行混淆器得到的结果基本相同。因此,它比您尝试做的要好一些,而且容易得多。

您不能以这种方式编译您的顶级脚本,但这很容易解决。只需编写一个单行包装脚本,除了import真正的顶级脚本之外什么都不做。如果你if __name__ == '__main__':在那里有代码,你还需要将它移动到一个函数中,并且包装器变成一个导入模块并调用函数的两行代码......但这很难。)或者,你可以运行pyobfuscator 只是顶级脚本,但实际上,没有理由这样做。

事实上,许多打包工具可以选择自动为您完成所有这些工作,除了编写琐碎的顶级包装器。例如,默认py2app构建会将您自己模块的编译版本以及您所依赖的 stdlib 和站点包模块粘贴到pythonXY.zip应用程序包中的一个文件中,并设置嵌入式解释器以将该 zipfile 用作其 stdlib。

于 2013-08-13T02:31:26.870 回答
1

有一定的方法可以将模块树变成单个模块。但这不会是微不足道的。我能想到的最简单的事情是这样的:

首先,您需要一个模块列表。这很容易通过find命令或执行os.walk.

然后你需要使用grep或 Pythonre来获取每个文件中的所有导入语句,并使用它对模块进行拓扑排序。如果您只import foo在顶层执行绝对平面语句,那么这是一个微不足道的正则表达式。如果您还进行绝对包导入,或from foo import bar(或from foo import *),或在其他级别导入,这并不复杂。相对包导入有点困难,但没什么大不了的。当然,如果您进行任何动态导入、使用imp模块、安装导入挂钩等,那么您在这里就不走运了,但希望您不会。

接下来,您需要替换实际的导入语句。使用与上述相同的假设,这可以通过简单的sedor来完成re.sub,例如import\s+(\w+)with \1 = sys.modules['\1']

现在,对于困难的部分:您需要将每个模块转换为动态创建等效模块对象的东西。这是困难的部分。我认为您想要做的是转义整个模块代码,以便它可以放入三引号字符串中,然后执行以下操作:

import types
mod_globals = {}
exec('''
# escaped version of original module source goes here
''', mod_globals)
mod = types.ModuleType(module_name)
mod.__dict__.update(mod_globals)
sys.modules[module_name] = mod

现在只需将所有这些转换的模块连接在一起。结果几乎等同于您的原始代码,除了它在import foo; del foo开始时对所有模块(按依赖顺序)执行等效操作,因此启动时间可能会慢一些。

于 2013-08-13T02:16:35.863 回答
1

您可以制作一个工具:

  • 通读您的源文件并将所有标识符放在一个集合中。
  • 从该集合中递归搜索的标准和第三方模块(模块、类、函数、属性、参数)中减去所有标识符。
  • 也从该列表中减去一些明确排除的标识符,因为它们可能在 getattr/setattr/exec/eval 中使用
  • 用乱码替换剩余的标识符

或者你可以使用我写的这个工具来做这件事。

要混淆多个文件,请按如下方式使用:

  • 为了安全起见,请将您的源代码和有价值的数据备份到离线媒体。
  • 将 opy_config.txt 的副本放在项目的顶层目录中。
  • 根据 opy_config.txt 中的备注调整到你的需要。
  • 该文件仅包含纯 Python 并且已执行,因此您可以在其中做任何聪明的事情。
  • 打开一个命令窗口,转到项目的顶层目录并从那里运行 opy.py。
  • 如果您的项目的顶级目录是例如../work/project1,那么混淆结果将在../work/project1_opy。
  • 进一步调整 opy_config.txt,直到您对结果满意为止。
  • 键入“opy?” 或'python opy.py?' (不带引号)在命令行上显示帮助文本。
于 2015-06-17T11:26:08.113 回答
0

我认为您可以尝试使用find带有-exec选项的命令。

您可以使用以下命令执行目录中的所有 python 脚本。

find . -name "*.py" -exec python {} ';'

希望这有帮助。

编辑:

哦,对不起,我忽略了如果您单独混淆文件,它们可能无法正常运行,因为它将函数名称重命名为不同文件中的不同名称。

于 2013-08-13T01:51:29.683 回答