Files
qxzb/script/decrypt_swf.py
2026-03-01 10:12:57 +08:00

148 lines
4.0 KiB
Python

#!/usr/bin/env python3
"""
解密游戏的 Main.swf 文件
基于反编译得到的 BinaryEncrypt 类逻辑
"""
import sys
def conversion_key(key_str):
"""转换密钥字符串为数组"""
key_str = key_str.strip('-')
return [int(x) for x in key_str.split('-')]
def recover_swf_header(data):
"""恢复 SWF 文件头"""
data[0] = 67 # 'C'
data[1] = 87 # 'W'
data[2] = 83 # 'S'
return data
def remove_random_bytes(data, key_length):
"""移除随机字节"""
data_length = len(data)
result_length = data_length - key_length * 2
# 从 key_length 位置开始读取 result_length 字节
result = bytearray(data[key_length:key_length + result_length])
return result
def un_split_join_swf(data, key_array):
"""反分割合并 SWF"""
key_length = len(key_array)
data_length = len(data)
remainder = data_length % key_length
chunk_size = data_length // key_length
# 分割数据
chunks = [None] * key_length
for i in range(key_length):
start = i * chunk_size
end = start + chunk_size
chunks[key_array[i]] = bytearray(data[start:end])
# 获取余数部分
remainder_data = bytearray(data[data_length - remainder:])
# 重新组合
result = bytearray(data_length)
for i in range(key_length):
chunk = chunks[i]
start = i * chunk_size
result[start:start + chunk_size] = chunk
# 添加余数部分
result[data_length - remainder:] = remainder_data
return result
def decrypt_swf(encrypted_data, key_str):
"""解密 SWF 文件"""
print(f"🔐 开始解密...")
print(f" 密钥: {key_str}")
print(f" 加密文件大小: {len(encrypted_data)} 字节")
# 转换密钥
key_array = conversion_key(key_str)
print(f" 密钥数组: {key_array}")
# 反分割合并
print(f" 步骤1: 反分割合并...")
data = un_split_join_swf(encrypted_data, key_array)
# 移除随机字节
print(f" 步骤2: 移除随机字节...")
data = remove_random_bytes(data, len(key_array))
# 恢复 SWF 文件头
print(f" 步骤3: 恢复 SWF 文件头...")
data = recover_swf_header(data)
print(f"✅ 解密完成!")
print(f" 解密文件大小: {len(data)} 字节")
return bytes(data)
def main():
print("🎮 游戏 SWF 解密工具")
print("="*60)
if len(sys.argv) < 2:
print("用法: python3 decrypt_swf.py <加密的SWF文件>")
print("\n步骤:")
print("1. 下载加密的 Main.swf:")
print(" curl http://47.121.191.22:8012/swf13/Main.swf?verson=jz -o Main_encrypted.swf")
print("\n2. 解密:")
print(" python3 decrypt_swf.py Main_encrypted.swf")
print("\n3. 用 JPEXS 打开解密后的文件:")
print(" Main_decrypted.swf")
sys.exit(1)
input_file = sys.argv[1]
output_file = input_file.replace('.swf', '_decrypted.swf')
# 从反编译得到的密钥
key = "0-1-2-3-4-5-9-8-7-6"
print(f"📂 输入文件: {input_file}")
print(f"📂 输出文件: {output_file}")
try:
# 读取加密文件
with open(input_file, 'rb') as f:
encrypted_data = f.read()
# 解密
decrypted_data = decrypt_swf(encrypted_data, key)
# 保存解密文件
with open(output_file, 'wb') as f:
f.write(decrypted_data)
print(f"\n{'='*60}")
print(f"✅ 解密成功!")
print(f"📁 解密文件已保存: {output_file}")
print(f"\n💡 下一步:")
print(f" 用 JPEXS 打开 {output_file}")
print(f" 查找所有的 API 调用和 GM 命令")
print(f"{'='*60}")
except FileNotFoundError:
print(f"❌ 文件不存在: {input_file}")
sys.exit(1)
except Exception as e:
print(f"❌ 解密失败: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()