【问题标题】:Obfuscate a Python script in Unicode escape sequences在 Unicode 转义序列中混淆 Python 脚本
【发布时间】:2016-06-25 16:21:09
【问题描述】:

我想通过使用 Unicode 转义序列来混淆 Python 脚本。

例如,

print("Hello World")

在 Unicode 转义序列中是:

\x70\x72\x69\x6e\x74\x28\x22\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x22\x29

在我的命令行中,我可以通过以下方式实现:

$ python3 -c \x70\x72\x69\x6e\x74\x28\x22\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x22\x29
Hello World

我创建了一个文件并将“Hello World”Unicode 转义序列作为源代码放入其中。

但是当我运行它时,我得到:

$ python3 sample.py
SyntaxError: unexpected character after line continuation character

如何在我的源代码中使用 Unicode 转义序列。

【问题讨论】:

  • 问题是,python 将其读取为字符串,因此当您执行exec(unicode)os.system("python -c "+ unicode) 时,我得到同样的错误,因为它是一个字符串,它会添加“”到unicode。
  • 您的声明似乎是错误的:$ python3 -c \x70\x72\x69\x6e\x74\x28\x22\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x22\x29 Traceback (most recent call last): File "<string>", line 1, in <module> NameError: name 'x70x72x69x6ex74x28x22x48x65x6cx6cx6fx20x57x6fx72x6cx64x22x29' is not defined
  • 无论如何我不明白你的前提。 Hello World 已经是 utf-8。 Utf-8 是 7 位 ASCII 的超集。
  • 我刚试过python3 -c \x70\x72\x69\x6e\x74\x28\x22\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x22\x29,它可以工作。我的python版本是3.4.0。我想混淆代码
  • 您在哪里运行该命令?我相信我们看到不同的结果仅仅是因为你的 shell 正在解释转义,因此 python 解释器实际看到的只是 -c print("Hello World"),而我的 shell 忽略了转义。要对此进行测试,请尝试运行命令 import time;time.sleep(60) 的“unicode 版本”,然后使用 ps aux | grep python 检查该命令使用了哪个命令行,您应该会看到它没有转义。

标签: python-3.x unicode character-encoding


【解决方案1】:

您可以使用 PEP 263 标头,它告诉 Python 源代码是用哪种编码编写的。

格式为:

# coding=<encoding name>

通过使用unicode_escape 编解码器(选自https://docs.python.org/3/library/codecs.html),Python 将首先对您的字符串进行转义。

sample.py

# coding=unicode_escape
\x70\x72\x69\x6e\x74\x28\x22\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x22\x29

结果:

$ python3 sample.py
Hello World

【讨论】:

  • 以上适用于一个班轮。假设代码import os\n print(os.getcwd()) 我得到一个错误:SyntaxError: 'unicodeescape' codec can't decode bytes: truncated \xXX escape
  • 答案适用于多行。您正在错误地构建转义序列。您需要用一个 0 填充您的十六进制值。您需要这样做:"".join(["\\x0%x" % ord(i) for i in my_code])
  • 对于上述两行代码,您的解决方案出现错误:` 9d0f240f3 SyntaxError: invalid syntax`。我使用re.sub(r'\\xa$', '', ("\\x" + "\\x".join("{0:x}".format(ord(content)) for content in content))) 将代码转换为unicode。
  • 我搞砸了我的填充逻辑。它应该是"".join(["\\x%02x" % ord(i) for i in my_code])
  • \xa 是罪魁祸首,但无论如何,您的解决方案适用于其他未经测试的案例。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2018-02-24
  • 2010-09-06
  • 2011-04-29
  • 2020-09-11
  • 2011-05-29
相关资源
最近更新 更多