修改器-QZQ)
import pymem import pymem.process import tkinter as tk from tkinter import ttk, messagebox import threading import time import ctypes import keyboard # 需要安裝pip install keyboard # 罪惡都市 1.0原版 偏移 OFFSET_PLAYER_PTR 0x0054AD28 OFFSET_HEALTH 0x354 OFFSET_ARMOR 0x358 OFFSET_MONEY 0x0054ADC8 OFFSET_WANTED 0x00549788 # 警星指針偏移玩家對象內(nèi)部 OFFSET_WANTED_PTR 0x5F4 OFFSET_WANTED_VALUE 0x20 PM None BASE_ADDR 0 PROCESS_NAME gta-vc.exe # 秘籍NUTTERTOOLS 高級武器 CHEAT_WEAPON NUTTERTOOLS # 游戲附加 def attach_game(): global PM, BASE_ADDR try: PM pymem.Pymem(PROCESS_NAME) module pymem.process.module_from_name(PM.process_handle, PROCESS_NAME) BASE_ADDR module.lpBaseOfDll messagebox.showinfo(成功, 已附加 gta-vc.exe) status_label.config(text? 已連接游戲) except pymem.exception.ProcessNotFound: messagebox.showerror(錯(cuò)誤, 未找到 gta-vc.exe\n請先啟動(dòng)罪惡都市) status_label.config(text? 未找到游戲) PM None BASE_ADDR 0 except Exception as e: messagebox.showerror(異常, f附加失敗{str(e)}) status_label.config(text? 連接失敗) PM None BASE_ADDR 0 def get_player_ptr(): global PM, BASE_ADDR if PM is None or BASE_ADDR 0: return 0 try: return PM.read_int(BASE_ADDR OFFSET_PLAYER_PTR) except: return 0 # 寫入功能 def set_health(): global PM if PM is None: messagebox.showwarning(提示, 請先附加游戲) return player_ptr get_player_ptr() if player_ptr 0: messagebox.showerror(錯(cuò)誤, 讀取玩家指針失敗) return try: val float(health_entry.get()) PM.write_float(player_ptr OFFSET_HEALTH, val) except ValueError: messagebox.showerror(錯(cuò)誤, 請輸入數(shù)字) def set_armor(): global PM if PM is None: messagebox.showwarning(提示, 請先附加游戲) return player_ptr get_player_ptr() if player_ptr 0: messagebox.showerror(錯(cuò)誤, 讀取玩家指針失敗) return try: val float(armor_entry.get()) PM.write_float(player_ptr OFFSET_ARMOR, val) except ValueError: messagebox.showerror(錯(cuò)誤, 請輸入數(shù)字) def set_money(): global PM, BASE_ADDR if PM is None: messagebox.showwarning(提示, 請先附加游戲) return if BASE_ADDR 0: messagebox.showerror(錯(cuò)誤,模塊基址獲取失敗) return try: val int(money_entry.get()) PM.write_int(BASE_ADDR OFFSET_MONEY, val) except ValueError: messagebox.showerror(錯(cuò)誤, 請輸入數(shù)字) def set_wanted(): global PM, BASE_ADDR if PM is None: messagebox.showwarning(提示, 請先附加游戲) return if BASE_ADDR 0: messagebox.showerror(錯(cuò)誤,模塊基址獲取失敗) return try: val int(wanted_entry.get()) if val 0 or val 6: messagebox.showwarning(提示, 通緝等級范圍0~6) return PM.write_int(BASE_ADDR OFFSET_WANTED, val) except ValueError: messagebox.showerror(錯(cuò)誤, 請輸入數(shù)字) def set_wanted_stars(): global PM, BASE_ADDR if PM is None: messagebox.showwarning(提示, 請先附加游戲) return player_ptr get_player_ptr() if player_ptr 0: messagebox.showerror(錯(cuò)誤, 讀取玩家指針失敗) return try: val int(wanted_star_entry.get()) if val 0 or val 6: messagebox.showwarning(提示, 警星范圍0~6) return wanted_ptr PM.read_int(player_ptr OFFSET_WANTED_PTR) if wanted_ptr 0: messagebox.showerror(錯(cuò)誤, 警星結(jié)構(gòu)指針為空請先觸發(fā)一次通緝。) return PM.write_int(wanted_ptr OFFSET_WANTED_VALUE, val) except ValueError: messagebox.showerror(錯(cuò)誤, 請輸入整數(shù)) except Exception as e: messagebox.showerror(異常, f寫入警星失敗{e}) # 秘籍模擬功能 def send_cheat(cheat_code): 模擬鍵盤輸入秘籍代碼 for ch in cheat_code: keyboard.press(ch) time.sleep(0.01) keyboard.release(ch) time.sleep(0.01) def press_f1_once(): 按一次 z刷一次高級武器 send_cheat(CHEAT_WEAPON) def cheat_loop(): 勾選后每 20s 自動(dòng)刷一次武器 global PM, BASE_ADDR while True: if auto_cheat_var.get() and PM is not None and BASE_ADDR ! 0: try: send_cheat(CHEAT_WEAPON) except: pass time.sleep(20) # 后臺刷新與凍結(jié) def loop_refresh_info(): global PM, BASE_ADDR while True: if PM is not None and BASE_ADDR ! 0: try: player_ptr PM.read_int(BASE_ADDR OFFSET_PLAYER_PTR) if player_ptr ! 0: hp PM.read_float(player_ptr OFFSET_HEALTH) ar PM.read_float(player_ptr OFFSET_ARMOR) wanted_ptr PM.read_int(player_ptr OFFSET_WANTED_PTR) if wanted_ptr ! 0: wanted_star PM.read_int(wanted_ptr OFFSET_WANTED_VALUE) else: wanted_star 0 else: hp 0 ar 0 wanted_star 0 mon PM.read_int(BASE_ADDR OFFSET_MONEY) want PM.read_int(BASE_ADDR OFFSET_WANTED) root.after(0, lambda: health_var.set(f{hp:.1f})) root.after(0, lambda: armor_var.set(f{ar:.1f})) root.after(0, lambda: money_var.set(str(mon))) root.after(0, lambda: wanted_var.set(str(want))) root.after(0, lambda: wanted_star_var.set(str(wanted_star))) except Exception: root.after(0, lambda: health_var.set(讀取失敗)) root.after(0, lambda: armor_var.set(讀取失敗)) root.after(0, lambda: money_var.set(讀取失敗)) root.after(0, lambda: wanted_var.set(讀取失敗)) root.after(0, lambda: wanted_star_var.set(讀取失敗)) time.sleep(0.3) def freeze_loop(): global PM while True: if freeze_var.get() and PM is not None and BASE_ADDR ! 0: try: player_ptr get_player_ptr() if player_ptr ! 0: PM.write_float(player_ptr OFFSET_HEALTH, float(health_entry.get())) PM.write_float(player_ptr OFFSET_ARMOR, float(armor_entry.get())) except: pass time.sleep(0.1) def freeze_wanted_loop(): global PM, BASE_ADDR while True: if freeze_wanted_var.get() and PM is not None and BASE_ADDR ! 0: try: player_ptr get_player_ptr() if player_ptr ! 0: wanted_ptr PM.read_int(player_ptr OFFSET_WANTED_PTR) if wanted_ptr ! 0: PM.write_int(wanted_ptr OFFSET_WANTED_VALUE, 0) PM.write_int(BASE_ADDR OFFSET_WANTED, 0) except: pass time.sleep(0.1) # GUI root tk.Tk() root.title(GTA罪惡都市 5項(xiàng)修改器) root.geometry(560x520) health_var tk.StringVar(value---) armor_var tk.StringVar(value---) money_var tk.StringVar(value---) wanted_var tk.StringVar(value---) wanted_star_var tk.StringVar(value---) status_label ttk.Label(root, text? 未連接游戲, font(Consolas,11)) status_label.pack(pady5) attach_btn ttk.Button(root, text1.附加游戲進(jìn)程, commandattach_game) attach_btn.pack(pady3) frame ttk.Frame(root) frame.pack(pady10, fillx, padx20) # 生命 ttk.Label(frame, text生命值).grid(row0, column0, stickyw) health_entry ttk.Entry(frame, width12) health_entry.grid(row0, column1, padx5) health_entry.insert(0, 200.0) ttk.Button(frame, text寫入, commandset_health).grid(row0, column2, padx2) ttk.Label(frame, text當(dāng)前).grid(row0, column3, padx3) ttk.Label(frame, textvariablehealth_var).grid(row0, column4) # 護(hù)甲 ttk.Label(frame, text護(hù) 甲).grid(row1, column0, stickyw) armor_entry ttk.Entry(frame, width12) armor_entry.grid(row1, column1, padx5) armor_entry.insert(0, 200.0) ttk.Button(frame, text寫入, commandset_armor).grid(row1, column2, padx2) ttk.Label(frame, text當(dāng)前).grid(row1, column3, padx3) ttk.Label(frame, textvariablearmor_var).grid(row1, column4) # 金錢 ttk.Label(frame, text金 錢).grid(row2, column0, stickyw) money_entry ttk.Entry(frame, width12) money_entry.grid(row2, column1, padx5) money_entry.insert(0, 99999999) ttk.Button(frame, text寫入, commandset_money).grid(row2, column2, padx2) ttk.Label(frame, text當(dāng)前).grid(row2, column3, padx3) ttk.Label(frame, textvariablemoney_var).grid(row2, column4) # 通緝值 ttk.Label(frame, text通緝值).grid(row3, column0, stickyw) wanted_entry ttk.Entry(frame, width12) wanted_entry.grid(row3, column1, padx5) wanted_entry.insert(0, 0) ttk.Button(frame, text寫入, commandset_wanted).grid(row3, column2, padx2) ttk.Label(frame, text當(dāng)前).grid(row3, column3, padx3) ttk.Label(frame, textvariablewanted_var).grid(row3, column4) # 警星數(shù) ttk.Label(frame, text警星數(shù)).grid(row4, column0, stickyw) wanted_star_entry ttk.Entry(frame, width12) wanted_star_entry.grid(row4, column1, padx5) wanted_star_entry.insert(0, 0) ttk.Button(frame, text寫入, commandset_wanted_stars).grid(row4, column2, padx2) ttk.Label(frame, text當(dāng)前).grid(row4, column3, padx3) ttk.Label(frame, textvariablewanted_star_var).grid(row4, column4) # 凍結(jié)選項(xiàng) freeze_var tk.BooleanVar() freeze_check ttk.Checkbutton(root, text凍結(jié)生命與護(hù)甲不掉血, variablefreeze_var) freeze_check.pack(pady2) freeze_wanted_var tk.BooleanVar() freeze_wanted_check ttk.Checkbutton(root, text鎖定警星為0永不被通緝, variablefreeze_wanted_var) freeze_wanted_check.pack(pady2) # z 熱鍵 自動(dòng)刷武器 auto_cheat_var tk.BooleanVar() auto_cheat_check ttk.Checkbutton(root, text自動(dòng)刷高級武器z/NUTTERTOOLS20s一次, variableauto_cheat_var) auto_cheat_check.pack(pady2) f1_btn ttk.Button(root, text按一次 z 刷高級武器, commandpress_f1_once) f1_btn.pack(pady2) # 綁定真實(shí) z 鍵 keyboard.add_hotkey(z, press_f1_once) # 啟動(dòng)后臺線程 threading.Thread(targetloop_refresh_info, daemonTrue).start() threading.Thread(targetfreeze_loop, daemonTrue).start() threading.Thread(targetfreeze_wanted_loop, daemonTrue).start() threading.Thread(targetcheat_loop, daemonTrue).start() root.mainloop()