返回列表 发布新帖

红警2之心灵终结金钱修改器python源码

2548 1
小K网牛逼 发表于 2025-11-1 00:00:13 | 查看全部 阅读模式 <

马上注册,结交更多好友,享用更多功能,让你轻松玩转小K网。

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

×
以管理员打开程序即可自动运行,初次修改为999999,低于500000将再次修改为999999。游戏金钱地址用CE修改器找到的,目前仅找到了修改金钱的方法,已经做到了自动修改。其他建造速度和超级武器未找到基址,欢迎各位大佬提供帮助。目前仅测试了红警2之心灵终结可用,其他版本未测试。

  1. import pymem
  2. import pymem.process
  3. import psutil
  4. import time
  5. import sys
  6. import threading
  7. import tkinter as tk
  8. from tkinter import ttk, messagebox, scrolledtext
  9. import ctypes
  10. class MoneyMonitorGUI:
  11.         def __init__(self, root):
  12.                 self.root = root
  13.                 self.root.title("红警2金钱监控器")
  14.                 self.root.geometry("600x580")
  15.                 self.root.resizable(True, True)
  16.                 # 检查是否以管理员身份运行
  17.                 if not self.is_admin():
  18.                         self.show_admin_warning()
  19.                         return
  20.                 # 初始化监控器
  21.                 self.monitor = MoneyMonitor()
  22.                 self.monitor_thread = None
  23.                 # 创建界面
  24.                 self.create_widgets()
  25.                 # 重定向输出到文本框
  26.                 self.redirect_output()
  27.                 # 自动启动监控
  28.                 self.start_monitor()
  29.         def is_admin(self):
  30.                 """检查是否以管理员身份运行"""
  31.                 try:
  32.                         return ctypes.windll.shell32.IsUserAnAdmin()
  33.                 except:
  34.                         return False
  35.         def show_admin_warning(self):
  36.                 """显示管理员权限警告"""
  37.                 # 创建一个临时的顶层窗口用于显示警告
  38.                 temp_window = tk.Tk()
  39.                 temp_window.withdraw()  # 隐藏主窗口
  40.                 messagebox.showerror("权限错误",
  41.                                                         "此程序需要以管理员身份运行才能正常工作!\n\n"
  42.                                                         "请右键点击程序图标,选择「以管理员身份运行」。")
  43.                 temp_window.destroy()
  44.                 self.root.destroy()
  45.                 sys.exit(1)
  46.         def create_widgets(self):
  47.                 # 主框架
  48.                 main_frame = ttk.Frame(self.root, padding="10")
  49.                 main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
  50.                 # 配置网格权重
  51.                 self.root.columnconfigure(0, weight=1)
  52.                 self.root.rowconfigure(0, weight=1)
  53.                 main_frame.columnconfigure(1, weight=1)
  54.                 main_frame.rowconfigure(4, weight=1)
  55.                 # 标题
  56.                 title_label = ttk.Label(main_frame, text="红警2金钱监控器", font=("Arial", 16, "bold"))
  57.                 title_label.grid(row=0, column=0, columnspan=3, pady=(0, 20))
  58.                 # 操作按钮框架
  59.                 button_frame = ttk.LabelFrame(main_frame, text="操作选项", padding="10")
  60.                 button_frame.grid(row=1, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(0, 10))
  61.                 ttk.Button(button_frame, text="单次修改金钱", command=self.single_modify).pack(side=tk.LEFT, padx=(0, 10))
  62.                 self.start_button = ttk.Button(button_frame, text="停止监控", command=self.toggle_monitor)
  63.                 self.start_button.pack(side=tk.LEFT, padx=(0, 10))
  64.                 # 参数设置框架
  65.                 settings_frame = ttk.LabelFrame(main_frame, text="监控参数设置", padding="10")
  66.                 settings_frame.grid(row=2, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(0, 10))
  67.                 # 更新间隔
  68.                 ttk.Label(settings_frame, text="更新间隔(秒):").grid(row=0, column=0, sticky=tk.W, padx=(0, 5))
  69.                 self.interval_var = tk.StringVar(value=str(self.monitor.update_interval))
  70.                 ttk.Entry(settings_frame, textvariable=self.interval_var, width=10).grid(row=0, column=1, sticky=tk.W, padx=(0, 10))
  71.                 # 自动补充阈值和目标金钱值在同一行
  72.                 ttk.Label(settings_frame, text="自动补充阈值:").grid(row=0, column=2, sticky=tk.W, padx=(10, 5))
  73.                 self.threshold_var = tk.StringVar(value=str(self.monitor.min_money_threshold))
  74.                 ttk.Entry(settings_frame, textvariable=self.threshold_var, width=10).grid(row=0, column=3, sticky=tk.W, padx=(0, 5))
  75.                 ttk.Label(settings_frame, text="目标金钱值:").grid(row=0, column=4, sticky=tk.W, padx=(5, 5))
  76.                 self.target_var = tk.StringVar(value=str(self.monitor.target_money))
  77.                 ttk.Entry(settings_frame, textvariable=self.target_var, width=10).grid(row=0, column=5, sticky=tk.W, padx=(0, 10))
  78.                 # 应用设置按钮
  79.                 ttk.Button(settings_frame, text="应用设置", command=self.apply_settings).grid(row=1, column=0, columnspan=6, pady=(10, 0))
  80.                 # 状态显示框架
  81.                 status_frame = ttk.LabelFrame(main_frame, text="运行状态", padding="10")
  82.                 status_frame.grid(row=3, column=0, columnspan=3, sticky=(tk.W, tk.E, tk.N, tk.S), pady=(0, 10))
  83.                 status_frame.columnconfigure(0, weight=1)
  84.                 status_frame.rowconfigure(0, weight=1)
  85.                 # 日志文本框
  86.                 self.log_text = scrolledtext.ScrolledText(status_frame, height=15, state='disabled')
  87.                 self.log_text.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
  88.                 # 清空日志按钮
  89.                 ttk.Button(status_frame, text="清空日志", command=self.clear_log).grid(row=1, column=0, pady=(5, 0))
  90.         def redirect_output(self):
  91.                 # 重定向print输出到文本框
  92.                 import io
  93.                 class TextRedirector(io.StringIO):
  94.                         def __init__(self, widget):
  95.                                 super().__init__()
  96.                                 self.widget = widget
  97.                         def write(self, s):
  98.                                 self.widget.config(state='normal')
  99.                                 self.widget.insert(tk.END, s)
  100.                                 self.widget.see(tk.END)
  101.                                 self.widget.config(state='disabled')
  102.                 sys.stdout = TextRedirector(self.log_text)
  103.         def single_modify(self):
  104.                 # 在新线程中执行单次修改,避免阻塞GUI
  105.                 threading.Thread(target=self._single_modify_thread, daemon=True).start()
  106.         def _single_modify_thread(self):
  107.                 print("开始单次修改金钱...")
  108.                 self.monitor.single_modify()
  109.         def toggle_monitor(self):
  110.                 if self.monitor.running:
  111.                         self.stop_monitor()
  112.                 else:
  113.                         self.start_monitor()
  114.         def start_monitor(self):
  115.                 # 应用当前设置
  116.                 self.apply_settings()
  117.                 # 在新线程中启动监控
  118.                 self.monitor.running = True
  119.                 self.monitor_thread = threading.Thread(target=self.monitor.monitor_loop, daemon=True)
  120.                 self.monitor_thread.start()
  121.                 self.start_button.config(text="停止监控")
  122.                 print("监控已启动...")
  123.         def stop_monitor(self):
  124.                 if self.monitor.running:
  125.                         self.monitor.running = False
  126.                         self.start_button.config(text="启动监控")
  127.                         print("监控已停止...")
  128.         def apply_settings(self):
  129.                 try:
  130.                         interval = int(self.interval_var.get())
  131.                         threshold = int(self.threshold_var.get())
  132.                         target = int(self.target_var.get())
  133.                         self.monitor.set_monitor_settings(interval, threshold, target)
  134.                         print(f"参数已更新: 间隔={interval}s, 阈值={threshold}, 目标={target}")
  135.                 except ValueError:
  136.                         messagebox.showerror("错误", "请输入有效的数字参数")
  137.         def clear_log(self):
  138.                 self.log_text.config(state='normal')
  139.                 self.log_text.delete(1.0, tk.END)
  140.                 self.log_text.config(state='disabled')
  141. class MoneyMonitor:
  142.         def __init__(self):
  143.                 self.running = False
  144.                 self.pm = None
  145.                 self.base_address = None
  146.                 self.update_interval = 10  # 修改为10秒
  147.                 self.min_money_threshold = 500000  # 修改阈值为500000
  148.                 self.target_money = 999999  # 修改目标值为999999
  149.         def get_dynamic_base_address(self):
  150.                 """动态获取当前游戏的基址"""
  151.                 try:
  152.                         # 查找游戏进程
  153.                         pid = None
  154.                         for proc in psutil.process_iter(['pid', 'name']):
  155.                                 if proc.info['name'] and 'gamemd.exe' in proc.info['name'].lower():
  156.                                         pid = proc.info['pid']
  157.                                         break
  158.                         if not pid:
  159.                                 return None, None
  160.                         # 连接到进程并获取基址
  161.                         pm = pymem.Pymem()
  162.                         pm.open_process_from_id(pid)
  163.                         game_module = pymem.process.module_from_name(pm.process_handle, "gamemd.exe")
  164.                         return pm, game_module.lpBaseOfDll if game_module else None
  165.                 except Exception as e:
  166.                         print(f"获取基址失败: {e}")
  167.                         return None, None
  168.         def calculate_money_addresses(self):
  169.                 """计算两个金钱地址"""
  170.                 try:
  171.                         if not self.pm or not self.base_address:
  172.                                 return None, None
  173.                         # 渲染地址
  174.                         render_address = self.base_address + 0x484D08
  175.                         # 实际地址(通过指针链)
  176.                         base_ptr = self.base_address + 0x00683D4C
  177.                         level1 = self.pm.read_int(base_ptr)
  178.                         actual_address = level1 + 0x30C
  179.                         return render_address, actual_address
  180.                 except Exception as e:
  181.                         print(f"计算地址失败: {e}")
  182.                         return None, None
  183.         def read_money_values(self, render_addr, actual_addr):
  184.                 """读取两个金钱地址的值"""
  185.                 try:
  186.                         render_value = self.pm.read_int(render_addr)
  187.                         actual_value = self.pm.read_int(actual_addr)
  188.                         return render_value, actual_value
  189.                 except Exception as e:
  190.                         print(f"读取金钱值失败: {e}")
  191.                         return None, None
  192.         def write_money_values(self, render_addr, actual_addr, value):
  193.                 """写入两个金钱地址的值"""
  194.                 try:
  195.                         self.pm.write_int(render_addr, value)
  196.                         self.pm.write_int(actual_addr, value)
  197.                         return True
  198.                 except Exception as e:
  199.                         print(f"写入金钱值失败: {e}")
  200.                         return False
  201.         def auto_refill_money(self, render_addr, actual_addr):
  202.                 """自动补充金钱"""
  203.                 try:
  204.                         render_value, actual_value = self.read_money_values(render_addr, actual_addr)
  205.                         if render_value is None or actual_value is None:
  206.                                 return False
  207.                         # 如果任意一个值低于阈值,就补充
  208.                         if render_value < self.min_money_threshold or actual_value < self.min_money_threshold:
  209.                                 success = self.write_money_values(render_addr, actual_addr, self.target_money)
  210.                                 if success:
  211.                                         print(f"💰 自动补充: {max(render_value, actual_value)} -> {self.target_money}")
  212.                                 return success
  213.                         return True
  214.                 except Exception as e:
  215.                         print(f"自动补充失败: {e}")
  216.                         return False
  217.         def single_modify(self):
  218.                 """单次修改金钱"""
  219.                 self.pm, self.base_address = self.get_dynamic_base_address()
  220.                 if not self.pm or not self.base_address:
  221.                         print("无法连接到游戏进程")
  222.                         return False
  223.                 print(f"检测到游戏基址: 0x{self.base_address:X}")
  224.                 render_addr, actual_addr = self.calculate_money_addresses()
  225.                 if not render_addr or not actual_addr:
  226.                         print("计算地址失败")
  227.                         return False
  228.                 print(f"渲染地址: 0x{render_addr:X}")
  229.                 print(f"实际地址: 0x{actual_addr:X}")
  230.                 # 读取当前值
  231.                 render_value, actual_value = self.read_money_values(render_addr, actual_addr)
  232.                 if render_value is None or actual_value is None:
  233.                         print("读取当前值失败")
  234.                         return False
  235.                 # 计算差值
  236.                 diff = abs(render_value - actual_value)
  237.                 print(f"当前渲染: {render_value}, 实际: {actual_value}, 差值: {diff}")
  238.                 # 修改为目标值
  239.                 success = self.write_money_values(render_addr, actual_addr, self.target_money)
  240.                 if success:
  241.                         print(f"✅ 修改成功! {actual_value} -> {self.target_money}")
  242.                 return success
  243.         def monitor_loop(self):
  244.                 """监控循环"""
  245.                 print(f"开始监控金钱... (更新间隔: {self.update_interval}秒)")
  246.                 print(f"自动补充阈值: {self.min_money_threshold}")
  247.                 print(f"目标金钱值: {self.target_money}")
  248.                 print("点击 GUI 中的停止按钮停止监控")
  249.                 last_base_address = None
  250.                 while self.running:
  251.                         try:
  252.                                 # 重新获取进程和基址(处理游戏重启)
  253.                                 self.pm, self.base_address = self.get_dynamic_base_address()
  254.                                 if not self.pm or not self.base_address:
  255.                                         print("❌ 游戏进程未找到,等待重新连接...")
  256.                                         time.sleep(5)
  257.                                         continue
  258.                                 # 检查基址是否变化(游戏重启)
  259.                                 if last_base_address != self.base_address:
  260.                                         print(f"🔄 检测到游戏基址: 0x{self.base_address:X}")
  261.                                         last_base_address = self.base_address
  262.                                 # 计算地址
  263.                                 render_addr, actual_addr = self.calculate_money_addresses()
  264.                                 if not render_addr or not actual_addr:
  265.                                         print("❌ 计算地址失败,跳过本次更新")
  266.                                         time.sleep(self.update_interval)
  267.                                         continue
  268.                                 # 读取当前值
  269.                                 render_value, actual_value = self.read_money_values(render_addr, actual_addr)
  270.                                 if render_value is None or actual_value is None:
  271.                                         print("❌ 读取值失败,跳过本次更新")
  272.                                         time.sleep(self.update_interval)
  273.                                         continue               
  274.                                 print(f"当前金钱为:{actual_value},低于补充阈值将自动改为{self.target_money},请放心游戏...")
  275.                                 # 自动补充
  276.                                 self.auto_refill_money(render_addr, actual_addr)
  277.                                 time.sleep(self.update_interval)
  278.                         except Exception as e:
  279.                                 print(f"监控循环错误: {e}")
  280.                                 time.sleep(self.update_interval)
  281.         def start_monitor(self):
  282.                 """开始监控"""
  283.                 self.running = True
  284.                 self.monitor_loop()
  285.         def set_monitor_settings(self, interval=10, threshold=500000, target=999999):
  286.                 """设置监控参数"""
  287.                 self.update_interval = interval
  288.                 self.min_money_threshold = threshold
  289.                 self.target_money = target
  290. def main():
  291.         root = tk.Tk()
  292.         app = MoneyMonitorGUI(root)
  293.         root.mainloop()
  294. if __name__ == "__main__":
  295.         main()
复制代码


评论1

微锁Lv.1 发表于 2025-11-3 03:59:37 | 查看全部 <
55
回复

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

您需要 登录 后才可以回复,轻松玩转社区,没有帐号?立即注册
快速回复
关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表