StylePaperPlane/Python-Confusion
GitHub: StylePaperPlane/Python-Confusion
一个集成控制流平坦化、名称替换、字符串混淆和字节码花指令的Python代码混淆工具,旨在增加逆向分析难度同时保持代码功能不变。
Stars: 3 | Forks: 0
# Python代码混淆器
当前发布版本:V0.10
这是一个Python代码混淆工具,集成了多种混淆技术,包括代码平坦化技术(Control Flow Flattening)、类/函数/方法名替换、变量/参数名混淆、字符串常量混淆和字节码级混淆,增加代码的理解难度,同时保持原始功能不变。
## 功能特点
- 将Python代码的控制流结构扁平化
- 引入状态变量和状态机结构替代原始控制流
- 随机化状态变量名称,增加逆向分析难度
- 使用随机字符串替换类名、函数名和类方法名
- 使用随机字符串替换局部变量名和函数参数名
- 将普通字符串常量改写为运行时等价表达式
- 编译为pyc字节码文件,并追加NOP花指令
- 保持代码功能完全一致
- 支持函数级别的代码混淆
## 技术原理
### 代码平坦化
代码平坦化是一种常见的代码混淆技术,它将原始代码的控制流结构(如条件分支、循环等)转换为一个扁平化的结构。具体做法是:
1. 为每个代码块分配一个唯一的状态值
2. 引入一个状态变量,用于控制程序流程
3. 使用一个大型switch-case结构(在Python中以if-elif实现)和while循环替代原始控制流
4. 每个代码块执行后修改状态变量以跳转到下一个代码块
这样,原始代码的控制流结构就被彻底打乱,使得逆向工程和代码分析变得更加困难。
### 类、函数和方法名混淆
名称混淆通过将类名、模块级函数名和类方法名替换为随机生成的字符串来增加代码的理解难度:
1. 为代码中的类、函数和非魔术类方法生成唯一的随机名称
2. 替换定义、构造调用、模块内函数调用和可追踪的方法调用
3. 保持函数调用关系不变,确保代码功能正常
### 变量名混淆
变量名混淆通过将局部变量名替换为随机生成的字符串来增加代码的理解难度:
1. 为代码中的每个局部变量和函数参数生成唯一的随机名称
2. 同步更新函数体内引用和模块内关键字参数调用
3. 保持模块级别变量名不变,确保模块导入正常
4. 保持变量作用域一致性,确保代码功能正常
### 字符串常量混淆
字符串常量混淆会跳过模块、类和函数 docstring,将普通字符串常量改写为运行时还原表达式。混淆后的源码不再以注释形式写入任何映射表,映射只通过库 API 的 `ObfuscationResult` 返回。
### 字节码混淆
字节码混淆在编译后的Python字节码级别进行操作:
1. 将源代码编译为Python字节码
2. 为兼容Python 3.8-3.12,在字节码对象末尾追加无操作(NOP)指令
3. 将混淆后的字节码保存为pyc文件
4. 防止简单的反编译和代码恢复
## 安装
要求Python 3.8或更高版本。
pip install -r requirements.txt
## 使用方法
### 命令行方式
python main.py input.py -o output.py --pyc --nop-ratio 0.2
参数说明:
- `input.py`: 输入的Python文件
- `-o output.py`: 输出的混淆后文件
- `--no-flatten`: 禁用代码平坦化
- `--no-name-obfuscation`: 禁用类名、函数名和方法名混淆
- `--no-var-obfuscation`: 禁用变量名和参数名混淆
- `--no-string-obfuscation`: 禁用字符串常量混淆
- `--pyc`: 编译为pyc文件并追加NOP指令
- `--nop-ratio`: NOP指令比例 (默认: 0.2)
### 图形界面方式
本项目现在提供了基于Tkinter的图形用户界面,可以通过以下方式启动:
# 从项目根目录运行
python -m ui.app
图形界面提供了所有混淆选项的配置,并且有详细的操作日志输出。
### 作为库使用
from mods.config import ObfuscationConfig
from mods.pipeline import obfuscate_source
config = ObfuscationConfig(
flatten_code=True, # 启用代码平坦化
rename_functions=True, # 启用函数名混淆
rename_classes=True, # 启用类名混淆
rename_methods=True, # 启用类方法名混淆
rename_variables=True, # 启用变量名混淆
rename_parameters=True,# 启用参数名混淆
obfuscate_strings=True,# 启用字符串常量混淆
output_format="source",
nop_ratio=0.2 # NOP指令比例
)
# 混淆代码
source_code = """
def hello_world():
print("Hello, World!")
"""
result = obfuscate_source(source_code, config)
print(result.source_code)
文件级处理可使用:
from mods.config import ObfuscationConfig
from mods.service import process_file
config = ObfuscationConfig(output_format="pyc", nop_ratio=0.2)
result = process_file("input.py", "output.pyc", config)
print(result.output_path)
## 模块结构
- `mods/config.py`:混淆配置对象。
- `mods/result.py`:混淆结果对象。
- `mods/pipeline.py`:源码级 AST 混淆管线。
- `mods/service.py`:文件级读写与输出编排。
- `mods/transforms/`:名称混淆和控制流平坦化等 AST 转换。
- `mods/bytecode.py`:pyc 编译和 NOP 追加。
- `mods/rendering.py`、`mods/io.py`:源码渲染和文件 I/O。
- `ui/windows/`:Tkinter 主窗口组装。
- `ui/components/`:文件选择、选项、按钮、日志和状态栏组件。
- `ui/controllers/`:UI 状态校验、配置构造和核心服务调用。
- `ui/dialogs/`、`ui/models/`:文件对话框和表单状态模型。
## 演示
运行以下命令以查看混淆效果演示:
python demo.py # 展示所有混淆技术
python demo.py --only-flatten # 仅展示代码平坦化
python demo.py --only-name-obfuscation # 仅展示函数名混淆
python demo.py --only-var-obfuscation # 仅展示变量名混淆
python demo.py --only-string-obfuscation # 仅展示字符串常量混淆
python demo.py --only-pyc # 仅展示pyc编译和字节码混淆
python demo.py --pyc --nop-ratio 0.3 # 自定义NOP指令比例
## 局限性
当前版本的混淆器有以下局限性:
1. 控制流平坦化处理函数和类方法体,但对复杂嵌套控制流的混淆强度仍有限
2. `__dunder__` 魔术方法、`self`、`cls`、导入符号、内置名和模块级常量默认受保护
3. 实例属性和类属性默认不混淆,避免破坏动态属性、第三方对象协议和反射访问
4. 字符串混淆会跳过 docstring,普通字符串常量会改写为运行时还原表达式
5. pyc文件在不同Python版本间可能不兼容
# Python代码混淆器 UI界面
这个模块提供了Python代码混淆器的图形用户界面,基于Tkinter实现。
## 功能特点
- 支持将Python源代码进行多种混淆处理
- 提供代码平坦化选项
- 支持类名、函数名和方法名混淆
- 支持变量名、参数名和字符串常量混淆
- 支持编译为pyc文件并追加NOP指令
- 可配置NOP指令的比例
- 提供直观的用户界面和详细的操作日志
## 使用方法
### 直接运行UI
# 从ui目录运行
python app.py
# 或从项目根目录运行
python -m ui.app
### 作为模块导入
from ui.windows.main_window import ObfuscatorMainWindow
# 创建并启动UI
app = ObfuscatorMainWindow()
app.mainloop()
## 界面说明
界面主要包含以下几个部分:
1. **文件选择区域**:选择输入的Python源文件和指定输出文件路径
2. **混淆选项区域**:配置混淆选项,包括代码平坦化、名称混淆、变量/参数混淆、字符串常量混淆和pyc编译
3. **操作按钮**:包含开始混淆和清除表单的按钮
4. **日志输出区域**:显示混淆过程的详细日志
5. **状态栏**:显示当前操作状态
## 依赖项
- Python 3.8+
- Tkinter (Python标准库)
- 项目内部的mods模块
## 注意事项
- 如果选择编译为pyc文件,输出文件的扩展名将自动调整为.pyc
- NOP指令比例范围为0-0.5,表示追加的NOP指令占原指令数量的比例
标签:DNS 解析, Python, SOC Prime, 云资产清单, 代码混淆, 开发工具, 无后门, 自动化payload嵌入, 软件保护, 逆向工具, 逆向工程