148 lines
4.0 KiB
Python
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()
|