936erpl/pyobfuscate-deobfuscator
GitHub: 936erpl/pyobfuscate-deobfuscator
逆向还原 Machine1337 的 pyobfuscate 混淆器所生成的 Python stub 文件,通过逆转其固定无密钥字节变换恢复原始源代码。
Stars: 0 | Forks: 0
# pyobfuscate-deobfuscate
一个针对 `pyobfuscate.py`(Machine1337 的 "Python Obfuscator 3")生成的 stub 的去混淆工具。它可以逆转字节混淆变换并恢复原始源代码。
## 为什么这会有效
`pyobfuscate.py` 使用一个名为 `nullifysec` 的固定且无密钥的变换来混淆 payload:它会反转字节数组并对每个字节减去 3,连续重复 3 次。结果会经过 UTF-8 解码,并作为原始的三引号字符串字面量嵌入到生成的 `stub.py` 中,同时还会附带一个内联的 decoder 函数,该函数会执行完全相反的操作(反转 + 加 3,重复 3 次),然后调用 `eval(compile(...))` 来运行它。
与基于密钥的加密程序不同,这里根本没有秘密可言——该变换是由混淆器的源代码固定的,而不是在每次运行时随机生成的。只有变量名是随机生成的。任何知道该算法的人(或者只要阅读 stub 自身的 decoder,因为每个 stub 中都包含该 decoder)都可以立即将其还原。
## 工作原理
1. 读取 `stub.py` 并提取包含混淆 payload 的原始字符串字面量 (`r"""..."""`)——通过模式匹配,而不是通过变量名,因为变量名在每次运行时都是随机生成的。
2. 将该字符串重新编码为 UTF-8 字节。
3. 应用逆向变换:反转字节数组并对每个字节加 3,连续重复 3 次——精确地抵消混淆器的反转减 3 步骤。
4. 将结果解码为 UTF-8 并打印原始源代码。
此过程不涉及任何 `eval()`——该 payload 仅被解析和打印,绝对不会被执行。
## 使用方法
```
python deobfuscate.py stub.py
```
如果未提供路径,则默认使用当前目录下的 `stub.py`。
## 免责声明
本项目仅出于教育目的而构建——旨在帮助您理解简单的混淆方案是如何工作的,以及为什么一旦算法被知晓,固定的、无密钥的字节变换就无法提供真正的保护。请仅对您拥有或获得授权进行分析的文件使用此工具。
标签:Python, 代码解混淆, 无后门, 脚本工具, 逆向分析, 逆向工具, 默认DNS解析器