python语言-连连看3.5完全版-KawaiQQ.EXE-修改器 v1.0代码-QZQ
发布时间:2026/10/2 12:58:21来源:尧图网络
import pymem import pymem.process import tkinter as tk from tkinter import ttk, messagebox import threading import time # 配置区 PROCESS_NAME KawaiQQ.EXE OFFSET_HINT 0xA3194 # 提示数量 WORD OFFSET_LIFE 0xA30D4 # 生命值 WORD OFFSET_SCORE 0xA3134 # 分数 FLOAT OFFSET_TIME 0xA3148 # 时间条 FLOAT ← 越小时间越长 # 时间条换算输入 1~100 的档位内部映射到内存值 # 档位 100 → 内存 1.0 → 时间条最长 # 档位 1 → 内存 100 → 时间条较短 def ui_to_mem_time(ui_value): ui_value max(1.0, min(100.0, float(ui_value))) return 101.0 - ui_value def mem_to_ui_time(mem_value): 内存值反向显示成档位方便直观 try: v float(mem_value) ui 101.0 - v return max(1.0, min(100.0, ui)) except Exception: return 0.0 # 内存操作核心 class LLKModifier: def __init__(self): self.pm None self.base None self.locked {} self.lock_thread None self.running False def attach(self): try: self.pm pymem.Pymem(PROCESS_NAME) module pymem.process.module_from_name( self.pm.process_handle, PROCESS_NAME ) self.base module.lpBaseOfDll return True, f附加成功基址: 0x{self.base:X} except Exception as e: self.pm None self.base None return False, f附加失败: {e} def is_attached(self): return self.pm is not None and self.base is not None def read_int(self, addr): return self.pm.read_int(addr) def write_int(self, addr, v): self.pm.write_int(addr, v) def read_word(self, addr): return self.pm.read_short(addr) def write_word(self, addr, v): self.pm.write_short(addr, v) def read_float(self, addr): return self.pm.read_float(addr) def write_float(self, addr, v): self.pm.write_float(addr, v) def get_hint_addr(self): return self.base OFFSET_HINT def get_life_addr(self): return self.base OFFSET_LIFE def get_score_addr(self): return self.base OFFSET_SCORE def get_time_addr(self): return self.base OFFSET_TIME def read_hint(self): return self.read_word(self.get_hint_addr()) def read_life(self): return self.read_word(self.get_life_addr()) def read_score(self): return self.read_float(self.get_score_addr()) def read_time(self): return self.read_float(self.get_time_addr()) def write_hint(self, v): self.write_word(self.get_hint_addr(), v 0xFFFF) def write_life(self, v): self.write_word(self.get_life_addr(), v 0xFFFF) def write_score(self, v): self.write_float(self.get_score_addr(), float(v)) def write_time(self, v): self.write_float(self.get_time_addr(), float(v)) def start_lock(self): if self.running: return self.running True self.lock_thread threading.Thread(targetself._lock_loop, daemonTrue) self.lock_thread.start() def stop_lock(self): self.running False def _lock_loop(self): while self.running: if self.is_attached(): for addr, (value, dtype) in list(self.locked.items()): try: if dtype int: self.write_int(addr, value) elif dtype word: self.write_word(addr, value) elif dtype float: self.write_float(addr, value) except Exception: pass time.sleep(0.05) def set_lock(self, addr, value, dtypeint): self.locked[addr] (value, dtype) def remove_lock(self, addr): self.locked.pop(addr, None) def clear_locks(self): self.locked.clear() # GUI class ModifierGUI: def __init__(self, root): self.root root self.root.title(连连看3.5完全版-KawaiQQ.EXE-修改器 v1.0) self.root.geometry(600x660) self.root.resizable(False, False) self.mod LLKModifier() self._build_ui() self._auto_attach() def _build_ui(self): # 进程状态 top ttk.LabelFrame(self.root, text进程状态, padding10) top.pack(fillx, padx10, pady5) self.status_var tk.StringVar(value未附加) ttk.Label(top, textvariableself.status_var, foregroundred).pack(sideleft) ttk.Button(top, text附加游戏, commandself._auto_attach).pack(sideright) ttk.Button(top, text刷新, commandself.refresh_values).pack(sideright, padx5) # 提示 / 生命 / 分数 self._make_row(提示数量 (WORD A3194), hint, 9999) self._make_row(生命值 (WORD A30D4), life, 9999) self._make_row(分数 (FLOAT A3134), score, 999999.0) # ---------- 时间条特殊反向 ---------- time_frame ttk.LabelFrame( self.root, text时间条 (FLOAT A3148) ★ 档位越大 时间越长 ★, padding10 ) time_frame.pack(fillx, padx10, pady4) ttk.Label(time_frame, text当前档位:).grid(row0, column0, stickyw) self.time_var tk.StringVar(value--) ttk.Label(time_frame, textvariableself.time_var, width14, foregroundblue).grid(row0, column1, stickyw) ttk.Label(time_frame, text设为档位 (1~100):).grid( row0, column2, stickyw, padx(20, 0)) self.time_entry ttk.Entry(time_frame, width12) self.time_entry.insert(0, 100) self.time_entry.grid(row0, column3, stickyw) ttk.Button(time_frame, text写入, commandself.do_write_time).grid(row0, column4, padx5) self.time_lock_var tk.BooleanVar() ttk.Checkbutton(time_frame, text锁定, variableself.time_lock_var, commandself.do_lock_time).grid(row0, column5, padx5) # 快捷按钮 quick ttk.Frame(time_frame) quick.grid(row1, column0, columnspan6, pady6, stickyw) ttk.Label(quick, text快捷:).pack(sideleft) for label, val in [(较短 30, 30), (中等 60, 60), (较长 90, 90), (最长 100, 100)]: ttk.Button(quick, textlabel, width8, commandlambda vval: self._set_time_quick(v)).pack(sideleft, padx3) # 日志 log_frame ttk.LabelFrame(self.root, text日志, padding5) log_frame.pack(fillboth, expandTrue, padx10, pady5) self.log_text tk.Text(log_frame, height8, statedisabled) self.log_text.pack(fillboth, expandTrue) # 底部 bottom ttk.Frame(self.root) bottom.pack(fillx, padx10, pady5) ttk.Button(bottom, text全部锁定, commandself.start_all_lock).pack(sideleft) ttk.Button(bottom, text全部解锁, commandself.stop_all_lock).pack(sideleft, padx5) ttk.Button(bottom, text退出, commandself.root.quit).pack(sideright) def _make_row(self, title, name, default): frame ttk.LabelFrame(self.root, texttitle, padding10) frame.pack(fillx, padx10, pady4) ttk.Label(frame, text当前:).grid(row0, column0, stickyw) val_var tk.StringVar(value--) ttk.Label(frame, textvariableval_var, width14, foregroundblue).grid( row0, column1, stickyw) ttk.Label(frame, text设为:).grid(row0, column2, stickyw, padx(20, 0)) entry ttk.Entry(frame, width12) entry.insert(0, default) entry.grid(row0, column3, stickyw) ttk.Button(frame, text写入, commandlambda: self.do_write(name)).grid(row0, column4, padx5) lock_var tk.BooleanVar() ttk.Checkbutton(frame, text锁定, variablelock_var, commandlambda: self.do_lock(name)).grid(row0, column5, padx5) setattr(self, f{name}_var, val_var) setattr(self, f{name}_entry, entry) setattr(self, f{name}_lock_var, lock_var) # 逻辑 def log(self, msg): self.log_text.config(statenormal) self.log_text.insert(end, f[{time.strftime(%H:%M:%S)}] {msg}\n) self.log_text.see(end) self.log_text.config(statedisabled) def _auto_attach(self): def worker(): ok, msg self.mod.attach() if ok: self.status_var.set(f已附加 基址:0x{self.mod.base:X}) self.log(msg) self.mod.start_lock() self.refresh_values() else: self.status_var.set(未附加) self.log(msg) threading.Thread(targetworker, daemonTrue).start() def refresh_values(self): if not self.mod.is_attached(): return try: self.hint_var.set(str(self.mod.read_hint())) except Exception: self.hint_var.set(--) try: self.life_var.set(str(self.mod.read_life())) except Exception: self.life_var.set(--) try: self.score_var.set(f{self.mod.read_score():.2f}) except Exception: self.score_var.set(--) # 时间条把内存值换算成档位显示 try: mem self.mod.read_time() ui mem_to_ui_time(mem) self.time_var.set(f{ui:.1f} (内存{mem:.1f})) except Exception: self.time_var.set(--) def _check(self): if not self.mod.is_attached(): messagebox.showwarning(警告, 请先附加游戏) return False return True def do_write(self, name): if not self._check(): return entry getattr(self, f{name}_entry) try: if name in (hint, life): val int(entry.get()) getattr(self.mod, fwrite_{name})(val) else: val float(entry.get()) getattr(self.mod, fwrite_{name})(val) self.log(f{name} → {val}) self.refresh_values() except Exception as e: messagebox.showerror(错误, str(e)) def do_lock(self, name): if not self.mod.is_attached(): return lock_var getattr(self, f{name}_lock_var) entry getattr(self, f{name}_entry) addr getattr(self.mod, fget_{name}_addr)() if lock_var.get(): try: if name in (hint, life): val int(entry.get()) dtype word else: val float(entry.get()) dtype float self.mod.set_lock(addr, val, dtype) self.log(f锁定 {name} {val}) except Exception: pass else: self.mod.remove_lock(addr) self.log(f解锁 {name}) # ---------- 时间条专用反向换算 ---------- def _set_time_quick(self, ui_value): self.time_entry.delete(0, end) self.time_entry.insert(0, str(ui_value)) self.do_write_time() def do_write_time(self): if not self._check(): return try: ui_val float(self.time_entry.get()) mem_val ui_to_mem_time(ui_val) self.mod.write_time(mem_val) self.log(f时间条 档位{ui_val:.0f} → 内存{mem_val:.1f} (越大越久)) self.refresh_values() except Exception as e: messagebox.showerror(错误, str(e)) def do_lock_time(self): if not self.mod.is_attached(): return addr self.mod.get_time_addr() if self.time_lock_var.get(): try: ui_val float(self.time_entry.get()) mem_val ui_to_mem_time(ui_val) self.mod.set_lock(addr, mem_val, float) self.log(f锁定时间条 档位{ui_val:.0f} → 内存{mem_val:.1f}) except Exception: pass else: self.mod.remove_lock(addr) self.log(解锁时间条) def start_all_lock(self): if not self._check(): return for name in (hint, life, score): getattr(self, f{name}_lock_var).set(True) self.do_lock(name) self.time_lock_var.set(True) self.do_lock_time() self.log( 全部锁定 ) def stop_all_lock(self): for name in (hint, life, score): getattr(self, f{name}_lock_var).set(False) self.do_lock(name) self.time_lock_var.set(False) self.do_lock_time() self.mod.clear_locks() self.log( 全部解锁 ) if __name__ __main__: root tk.Tk() app ModifierGUI(root) root.mainloop()
网站建设高端定制企业官网