fqdeng自留地

virtualizor 破解

2026-02-17

参考

破解代码

  • python
import base64
import zlib
import json
import argparse
import sys
import os
import datetime
import re
import shutil

# --- 核心工具函数 ---

def bit_reverse_byte(n):
    """字节位反转"""
    return int('{:08b}'.format(n)[::-1], 2)

# --- 解密逻辑 ---

def sm_decode(encoded_txt):
    if not encoded_txt:
        return None
    try:
        if isinstance(encoded_txt, str):
            encoded_txt = encoded_txt.encode('utf-8')
        
        step1_data = base64.b64decode(encoded_txt)

        step2_buffer = bytearray()
        for byte in step1_data:
            step2_buffer.append(bit_reverse_byte(byte))

        step3_data = zlib.decompress(step2_buffer)

        text_str = step3_data.decode('utf-8')
        trans_table = str.maketrans("!@#$%^&*()", "abcdefghij")
        step4_text = text_str.translate(trans_table)

        final_data = base64.b64decode(step4_text)
        return final_data.decode('utf-8')

    except Exception as e:
        sys.stderr.write(f"[!] 解密失败: {e}\n")
        return None

# --- 加密逻辑 ---

def sm_encode(json_str):
    if not json_str:
        return None
    try:
        step1_b64 = base64.b64encode(json_str.encode('utf-8')).decode('utf-8')

        trans_table = str.maketrans("abcdefghij", "!@#$%^&*()")
        step2_replaced = step1_b64.translate(trans_table)

        step3_compressed = zlib.compress(step2_replaced.encode('utf-8'))

        step4_buffer = bytearray()
        for byte in step3_compressed:
            step4_buffer.append(bit_reverse_byte(byte))

        final_encoded = base64.b64encode(step4_buffer).decode('utf-8')
        return final_encoded
    except Exception as e:
        sys.stderr.write(f"[!] 加密失败: {e}\n")
        return None

# --- 修改逻辑 ---

def modify_license_data(json_data):
    """修改过期时间为明天"""
    # 获取当前时间 + 1天
    now = datetime.datetime.now()
    tomorrow = now + datetime.timedelta(days=1)
    
    print(f"[*] 设置新的过期时间为: {tomorrow.strftime('%Y-%m-%d %H:%M:%S')}")

    # 修改字段
    json_data['active'] = 1
    json_data['active_txt'] = '<font color="green">Active</font>'
    # 格式: YYYYMMDD
    json_data['licexpires'] = tomorrow.strftime("%Y%m%d")
    # 格式: DD/MM/YYYY GMT
    json_data['licexpires_txt'] = tomorrow.strftime("%d/%m/%Y GMT")
    json_data['download_time'] = int(now.timestamp())
    
    return json_data

# --- JSON 特殊处理 ---

def precise_json_escape(json_str):
    """只转义 fast_mirrors 和 licexpires_txt 中的斜杠"""
    def escape_slash_in_match(match):
        return match.group(0).replace('/', '\\/')

    pattern_txt = r'"licexpires_txt":".*?"'
    json_str = re.sub(pattern_txt, escape_slash_in_match, json_str)

    pattern_mirrors = r'"fast_mirrors":\[.*?\]'
    json_str = re.sub(pattern_mirrors, escape_slash_in_match, json_str)

    return json_str

# --- 主程序 ---

def main():
    parser = argparse.ArgumentParser(description="License 自动续期工具")
    parser.add_argument("file_path", help="原始 License 文件路径")
    # 新增 --replace 选项
    parser.add_argument("--replace", action="store_true", help="生成临时文件后直接覆盖原文件")
    
    args = parser.parse_args()
    
    # 1. 读取文件
    if not os.path.exists(args.file_path):
        sys.stderr.write(f"[!] 错误: 文件不存在 -> {args.file_path}\n")
        sys.exit(1)

    print(f"[*] 正在读取文件: {args.file_path}")
    with open(args.file_path, 'r', encoding='utf-8') as f:
        original_content = f.read().strip()

    # 2. 解密
    decoded_json_str = sm_decode(original_content)
    if not decoded_json_str:
        sys.exit(1)

    try:
        json_data = json.loads(decoded_json_str)
        
        # --- [需求] 打印刚读取出来的原始 JSON ---
        print("\n" + "="*20 + " 原始 JSON 数据 " + "="*20)
        print(json.dumps(json_data, indent=4, ensure_ascii=False))
        print("="*56 + "\n")
        
    except json.JSONDecodeError:
        sys.stderr.write("[!] 解密成功但不是有效的 JSON\n")
        sys.exit(1)

    # 3. 修改数据 (日期改为明天)
    modified_data = modify_license_data(json_data)

    # 4. 生成 & 精准转义
    compact_json_str = json.dumps(modified_data, separators=(',', ':'))
    final_json_str = precise_json_escape(compact_json_str)

    print("=============修改后的json=============")
    print(final_json_str)
    # 5. 加密
    new_license_str = sm_encode(final_json_str)


    # 6. 生成临时文件
    tmp_file_path = "/tmp/license2.php"
    try:
        with open(tmp_file_path, 'w', encoding='utf-8') as f:
            f.write(new_license_str)
        print(f"[*] 临时文件已生成: {tmp_file_path}")
    except IOError as e:
        print(f"[!] 无法写入临时文件 {tmp_file_path}: {e}")
        sys.exit(1)

    # 7. 处理 --replace 逻辑
    if args.replace:
        print(f"[*] 检测到 --replace 参数,正在覆盖原文件...")
        try:
            shutil.copyfile(tmp_file_path, args.file_path)
            print(f"[SUCCESS] 文件已更新: {args.file_path}")
        except Exception as e:
            print(f"[!] 覆盖文件失败: {e}")
    else:
        print("-" * 60)
        print(f"[*] 未使用 --replace。新 License 内容如下 (也保存在 {tmp_file_path}):")
        print(new_license_str)
        print("-" * 60)

if __name__ == "__main__":
    main()
  • cron脚本
*/10 * * * * /usr/bin/python3 /root/crack.py /usr/local/virtualizor/license2.php --replace