#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk, messagebox
import struct
import time
import binascii
RC4_Key2 = b'Eg\xa2\x99_\x83\xf1\x10'
def rc4(Key: bytes, inData: bytes) -> bytes:
S = list(range(256))
K = list(Key)
K = (K * (256 // len(K) + 1))[:256]
j = 0
for i in range(256):
j = (S[i] + K[i] + j) % 256
S[i], S[j] = S[j], S[i]
i, j = 0, 0
out = bytearray()
for x in range(len(inData)):
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
out.append(S[(S[j] + S[i]) % 256] ^ inData[x])
return bytes(out)
def Long2Int(longdata):
lo = longdata & 0xFFFFFFFF
hi = (longdata >> 32) & 0x7FFFFFFF
return hi, lo
def KeygenSN(LicenseSerial, MachineID):
mhi, mlo = Long2Int(MachineID)
lhi, llo = Long2Int(LicenseSerial)
hi_Key = (mhi - lhi + 0x55667788) & 0x7FFFFFFF
lo_Key = (mlo + llo + 0x11223344) & 0xFFFFFFFF
Z0, = struct.unpack('<Q', struct.pack('<LL', lo_Key, hi_Key))
Z1 = int(time.time() + 100000000) ^ 0x56739ACD
s = sum(int(x, 16) for x in ("%x" % Z1)) % 10
return "%dZ%d%d" % (Z0, Z1, s)
def ParsePost(buf: bytes):
Info = struct.unpack('<3L2Q4LQ3L', buf[:0x40])
flag, CRC, UserSerial, LicenseSerial, MachineID, build_type, \
Ver_Major, Ver_Minor, Ver_Buildid, Ver_Timestamp, \
TimeOffset, Kclass, Random2 = Info
calc_crc = binascii.crc32(buf[8:]) & 0xFFFFFFFF
if calc_crc != CRC:
raise Exception(f"CRC校验失败,不是合法LicenseData")
SysInfoData = buf[0x40:]
return Info, SysInfoData
def DecodeRc4Str(hex_str: str):
buf = bytes.fromhex(hex_str.strip())
crypt_key = buf[:8] + RC4_Key2
payload_enc = buf[8:]
dec_buf = rc4(crypt_key, payload_enc)
return ParsePost(dec_buf)
class JebKeyGenApp:
def __init__(self, root):
self.root = root
self.root.title("JEB KeyGen")
# 主色:淡雅薄荷绿
bg_main = "#eef6f4"
card_bg = "#ffffff"
frame_bg = "#f4f9f8"
border_color = "#c5ddd8"
accent = "#73a89e"
self.root.configure(bg=bg_main)
w, h = 720, 380
screen_w = self.root.winfo_screenwidth()
screen_h = self.root.winfo_screenheight()
x = (screen_w - w) // 2
y = (screen_h - h) // 2
self.root.geometry(f"{w}x{h}+{x}+{y}")
self.root.resizable(False, False)
# 主容器
main = tk.Frame(root, bg=bg_main, padx=16, pady=16)
main.pack(fill=tk.BOTH, expand=True)
# 白色外卡
card = tk.Frame(main, bg=card_bg, bd=0)
card.pack(fill=tk.BOTH, expand=True)
# License Data 输入区容器:做成明显凹进的大框
tk.Label(
card,
text="License Data",
bg=card_bg,
font=("Microsoft YaHei UI", 11, "bold"),
fg="#2c3e50"
).pack(anchor="w", padx=14, pady=(14, 6))
# 外框:模拟凹陷阴影
txt_frame = tk.Frame(card, bg=border_color, bd=1)
txt_frame.pack(fill=tk.BOTH, expand=True, padx=14)
# 内框:输入区真正凹进去
txt_inner = tk.Frame(txt_frame, bg=frame_bg, bd=0, padx=10, pady=10)
txt_inner.pack(fill=tk.BOTH, expand=True)
self.txt_lic = tk.Text(
txt_inner,
height=6,
font=("Consolas", 9),
bg=frame_bg,
fg="#334443",
relief="sunken",
bd=2,
wrap="word"
)
self.txt_lic.pack(fill=tk.BOTH, expand=True)
# 按钮区
btn_frame = tk.Frame(card, bg=card_bg)
btn_frame.pack(pady=12)
self.gen_btn = tk.Button(
btn_frame,
text="生成 License Key",
command=self.do_gen,
bg=accent,
fg="white",
relief="flat",
font=("Microsoft YaHei UI", 10),
padx=24,
pady=7
)
self.gen_btn.pack()
self.gen_btn.bind("<Enter>", lambda e: self.gen_btn.config(bg="#5d9489"))
self.gen_btn.bind("<Leave>", lambda e: self.gen_btn.config(bg=accent))
# License Key 输出区
tk.Label(
card,
text="License Key(已自动复制剪贴板)",
bg=card_bg,
font=("Microsoft YaHei UI", 11, "bold"),
fg="#2c3e50"
).pack(anchor="w", padx=14, pady=(4, 6))
out_frame = tk.Frame(card, bg=border_color, bd=1)
out_frame.pack(fill=tk.X, padx=14, pady=(0, 14))
self.var_out = tk.StringVar()
self.entry_key = tk.Entry(
out_frame,
textvariable=self.var_out,
font=("Consolas", 10),
bg=frame_bg,
fg="#334443",
relief="sunken",
bd=2
)
self.entry_key.pack(fill=tk.X, padx=10, pady=10)
def do_gen(self):
self.var_out.set("")
raw = self.txt_lic.get("1.0", tk.END).strip()
if not raw:
messagebox.showwarning("提示", "请粘贴 License Data")
return
try:
info, _ = DecodeRc4Str(raw)
sn = KeygenSN(info[3], info[4])
self.var_out.set(sn)
self.root.clipboard_clear()
self.root.clipboard_append(sn)
self.root.update()
messagebox.showinfo("成功", f"密钥已生成并复制剪贴板\n{sn}")
except Exception as e:
messagebox.showerror("错误", str(e))
if __name__ == "__main__":
win = tk.Tk()
app = JebKeyGenApp(win)
win.mainloop()