C++ 游戏数据修改器:使用内存地址修改游戏数据
#include\x20\x3ciostream\x3e\n#include\x20\x3cssstringstream\x3e\n#include\x20\x3ciiomanip\x3e\n#ifdef\x20_WIN32\n#include\x20\x3cwindows.h\x3e\n#else\n#include\x20\x3cunistd.h\x3e\n#endif\n\nvoid\x20displayProcessID\x20\x28\x29\x20\x7b\n\x20\x20//\x20获取当前进程的PID\n#ifdef\x20_WIN32\n\x20\x20DWORD\x20pid\x20\x3d\x20GetCurrentProcessId\x28\x29\x3b\n#else\n\x20\x20pid_t\x20pid\x20\x3d\x20getpid\x28\x29\x3b\n#endif\n\n\x20\x20std\x3a\x3a\x20cout\x20\x3c\x3c\x20"进程ID:\x20"\x20\x3c\x3c\x20pid\x20\x3c\x3c\x20std\x3a\x3a\x20endl\x3b\n\x7d\n\nstd\x3a\x3a\x20string\x20getMemoryAddress\x20\x28void*\x20pointer\x29\x20\x7b\n\x20\x20std\x3a\x3a\x20stringstream\x20ss\x3b\n\x20\x20ss\x20\x3c\x3c\x20std\x3a\x3a\x20hex\x20\x3c\x3c\x20std\x3a\x3a\x20setw\x28sizeof\x28void*\x29\x20*\x202\x29\x20\x3c\x3c\x20std\x3a\x3a\x20setfill\x28'0'\x29\x20\x3c\x3c\x20reinterpret_cast\x3cuintptr_t\x3e\x28pointer\x29\x3b\n\x20\x20return\x20ss.str\x28\x29\x3b\n\x7d\n\nint\x20main\x20\x28\x29\x20\x7b\n\x20\x20displayProcessID\x28\x29\x3b\n\n\x20\x20//\x20初始化变量\n\x20\x20int\x20score\x20\x3d\x200\x3b\n\x20\x20bool\x20gameOver\x20\x3d\x20false\x3b\n\n\x20\x20//\x20显示变量的实时内存地址(以十六进制格式)\n\x20\x20std\x3a\x3a\x20cout\x20\x3c\x3c\x20"分数的内存地址: 0x"\x20\x3c\x3c\x20getMemoryAddress\x28&score\x29\x20\x3c\x3c\x20std\x3a\x3a\x20endl\x3b\n\x20\x20std\x3a\x3a\x20cout\x20\x3c\x3c\x20"游戏结束标志的内存地址: 0x"\x20\x3c\x3c\x20getMemoryAddress\x28&gameOver\x29\x20\x3c\x3c\x20std\x3a\x3a\x20endl\x3b\n\n\x20\x20while\x20\x28!gameOver\x29\x20\x7b\n\x20\x20\x20\x20//\x20显示当前分数和选项\n\x20\x20\x20\x20std\x3a\x3a\x20cout\x20\x3c\x3c\x20"当前分数:\x20"\x20\x3c\x3c\x20score\x20\x3c\x3c\x20std\x3a\x3a\x20endl\x3b\n\x20\x20\x20\x20std\x3a\x3a\x20cout\x20\x3c\x3c\x20"1. 增加分数"\x20\x3c\x3c\x20std\x3a\x3a\x20endl\x3b\n\x20\x20\x20\x20std\x3a\x3a\x20cout\x20\x3c\x3c\x20"2. 游戏结束"\x20\x3c\x3c\x20std\x3a\x3a\x20endl\x3b\n\n\x20\x20\x20\x20//\x20等待用户输入选项\n\x20\x20\x20\x20int\x20choice\x3b\n\x20\x20\x20\x20std\x3a\x3a\x20cin\x20\x3e\x3e\x20choice\x3b\n\n\x20\x20\x20\x20//\x20根据用户的选择执行相应操作\n\x20\x20\x20\x20switch\x20\x28choice\x29\x20\x7b\n\x20\x20\x20\x20case\x201:\n\x20\x20\x20\x20\x20\x20//\x20增加分数\n\x20\x20\x20\x20\x20\x20score\x20\x2b\x3d\x2010\x3b\n\x20\x20\x20\x20\x20\x20break\x3b\n\x20\x20\x20\x20case\x202:\n\x20\x20\x20\x20\x20\x20//\x20结束游戏\n\x20\x20\x20\x20\x20\x20gameOver\x20\x3d\x20true\x3b\n\x20\x20\x20\x20\x20\x20break\x3b\n\x20\x20\x20\x20default:\n\x20\x20\x20\x20\x20\x20std\x3a\x3a\x20cout\x20\x3c\x3c\x20"无效的选项!"\x20\x3c\x3c\x20std\x3a\x3a\x20endl\x3b\n\x20\x20\x20\x20\x20\x20break\x3b\n\x20\x20\x20\x20\x7d\n\x20\x20\x7d\n\n\x20\x20std\x3a\x3a\x20cout\x20\x3c\x3c\x20"游戏结束!最终分数:\x20"\x20\x3c\x3c\x20score\x20\x3c\x3c\x20std\x3a\x3a\x20endl\x3b\n\n\x20\x20return\x200\x3b\n\x7d\n\nimport\x20sys\nimport\x20ctypes\nimport\x20tkinter\x20as\x20tk\nfrom\x20tkinter\x20import\x20messagebox,\x20ttk\n\nclass\x20MemoryModifier:\n\x20\x20def\x20__init__\x28self\x29:\n\x20\x20\x20\x20if\x20sys.platform.startswith\x28'win32'\x29:\n\x20\x20\x20\x20\x20\x20self.kernel32\x20\x3d\x20ctypes.WinDLL\x28'kernel32'\x2c\x20use_last_error\x3dTrue\x29\n\x20\x20\x20\x20else:\n\x20\x20\x20\x20\x20\x20raise\x20NotImplementedError\x28"Unsupported\x20operating\x20system"\x29\n\n\x20\x20def\x20open_process\x28self,\x20pid\x29:\n\x20\x20\x20\x20process_handle\x20\x3d\x20self.kernel32.OpenProcess\x280x1F0FFF,\x20False,\x20pid\x29\n\x20\x20\x20\x20if\x20not\x20process_handle:\n\x20\x20\x20\x20\x20\x20error_code\x20\x3d\x20self.kernel32.GetLastError\x28\x29\n\x20\x20\x20\x20\x20\x20raise\x20OSError\x28error_code,\x20"Could\x20not\x20open\x20process"\x29\n\x20\x20\x20\x20return\x20process_handle\n\n\x20\x20def\x20write_memory\x28self,\x20process_handle,\x20address,\x20value\x29:\n\x20\x20\x20\x20buffer\x20\x3d\x20\x28ctypes.c_byte\x20*\x20ctypes.sizeof\x28ctypes.c_int\x29\x29.from_buffer\x28ctypes.c_int\x28value\x29\x29\n\x20\x20\x20\x20bytes_written\x20\x3d\x20ctypes.c_size_t\x28\x29\n\x20\x20\x20\x20result\x20\x3d\x20self.kernel32.WriteProcessMemory\x28process_handle,\x20address,\x20buffer,\x20ctypes.sizeof\x28buffer\x29,\x20ctypes.byref\x28bytes_written\x29\x29\n\x20\x20\x20\x20if\x20not\x20result\x20or\x20bytes_written.value\x20!\x3d\x20ctypes.sizeof\x28buffer\x29:\n\x20\x20\x20\x20\x20\x20raise\x20OSError\x28"Failed\x20to\x20write\x20memory"\x29\n\n\x20\x20def\x20read_memory\x28self,\x20process_handle,\x20address,\x20data_type\x29:\n\x20\x20\x20\x20if\x20data_type\x20\x3d\x3d\x20"int":\n\x20\x20\x20\x20\x20\x20buffer\x20\x3d\x20ctypes.c_int\x28\x29\n\x20\x20\x20\x20\x20\x20result\x20\x3d\x20self.kernel32.ReadProcessMemory\x28process_handle,\x20address,\x20ctypes.byref\x28buffer\x29,\x20ctypes.sizeof\x28buffer\x29,\x20None\x29\n\x20\x20\x20\x20\x20\x20if\x20not\x20result:\n\x20\x20\x20\x20\x20\x20\x20\x20raise\x20OSError\x28"Failed\x20to\x20read\x20memory"\x29\n\x20\x20\x20\x20\x20\x20return\x20buffer.value\n\x20\x20\x20\x20elif\x20data_type\x20\x3d\x3d\x20"float":\n\x20\x20\x20\x20\x20\x20buffer\x20\x3d\x20ctypes.c_float\x28\x29\n\x20\x20\x20\x20\x20\x20result\x20\x3d\x20self.kernel32.ReadProcessMemory\x28process_handle,\x20address,\x20ctypes.byref\x28buffer\x29,\x20ctypes.sizeof\x28buffer\x29,\x20None\x29\n\x20\x20\x20\x20\x20\x20if\x20not\x20result:\n\x20\x20\x20\x20\x20\x20\x20\x20raise\x20OSError\x28"Failed\x20to\x20read\x20memory"\x29\n\x20\x20\x20\x20\x20\x20return\x20buffer.value\n\x20\x20\x20\x20else:\n\x20\x20\x20\x20\x20\x20buffer\x20\x3d\x20\x28ctypes.c_byte\x20*\x20256\x29\x28\x29\n\x20\x20\x20\x20\x20\x20result\x20\x3d\x20self.kernel32.ReadProcessMemory\x28process_handle,\x20address,\x20ctypes.byref\x28buffer\x29,\x20ctypes.sizeof\x28buffer\x29,\x20None\x29\n\x20\x20\x20\x20\x20\x20if\x20not\x20result:\n\x20\x20\x20\x20\x20\x20\x20\x20raise\x20OSError\x28"Failed\x20to\x20read\x20memory"\x29\n\x20\x20\x20\x20\x20\x20return\x20buffer.value.decode\x28\x29.strip\x28"\x00"\x29\n\n\x20\x20def\x20close_process\x28self,\x20process_handle\x29:\n\x20\x20\x20\x20self.kernel32.CloseHandle\x28process_handle\x29\n\n\nclass\x20GameDataModifierGUI:\n\x20\x20def\x20__init__\x28self,\x20root\x29:\n\x20\x20\x20\x20self.root\x20\x3d\x20root\n\x20\x20\x20\x20self.root.title\x28"游戏数据修改器"\x29\n\x20\x20\x20\x20self.root.geometry\x28"400x300"\x29\n\n\x20\x20\x20\x20self.process_id_label\x20\x3d\x20tk.Label\x28self.root,\x20text="进程ID:"\x29\n\x20\x20\x20\x20self.process_id_label.pack\x28\x29\n\x20\x20\x20\x20self.process_id_entry\x20\x3d\x20tk.Entry\x28self.root\x29\n\x20\x20\x20\x20self.process_id_entry.pack\x28\x29\n\n\x20\x20\x20\x20self.memory_address_label\x20\x3d\x20tk.Label\x28self.root,\x20text="内存地址:"\x29\n\x20\x20\x20\x20self.memory_address_label.pack\x28\x29\n\x20\x20\x20\x20self.memory_address_entry\x20\x3d\x20tk.Entry\x28self.root\x29\n\x20\x20\x20\x20self.memory_address_entry.pack\x28\x29\n\n\x20\x20\x20\x20self.data_type_label\x20\x3d\x20tk.Label\x28self.root,\x20text="数据类型:"\x29\n\x20\x20\x20\x20self.data_type_label.pack\x28\x29\n\x20\x20\x20\x20self.data_type_combobox\x20\x3d\x20ttk.Combobox\x28self.root,\x20values\x3d["int",\x20"float",\x20"str"],\x20state="readonly"\x29\n\x20\x20\x20\x20self.data_type_combobox.current\x280\x29\n\x20\x20\x20\x20self.data_type_combobox.pack\x28\x29\n\n\x20\x20\x20\x20self.new_value_label\x20\x3d\x20tk.Label\x28self.root,\x20text="新值:"\x29\n\x20\x20\x20\x20self.new_value_label.pack\x28\x29\n\x20\x20\x20\x20self.new_value_entry\x20\x3d\x20tk.Entry\x28self.root\x29\n\x20\x20\x20\x20self.new_value_entry.pack\x28\x29\n\n\x20\x20\x20\x20self.modify_button\x20\x3d\x20tk.Button\x28self.root,\x20text="修改游戏数据",\x20command\x3dself.modify_game_data\x29\n\x20\x20\x20\x20self.modify_button.pack\x28\x29\n\n\x20\x20\x20\x20self.modifier\x20\x3d\x20MemoryModifier\x28\x29\n\n\x20\x20def\x20modify_game_data\x28self\x29:\n\x20\x20\x20\x20try:\n\x20\x20\x20\x20\x20\x20pid\x20\x3d\x20int\x28self.process_id_entry.get\x28\x29\x29\n\x20\x20\x20\x20\x20\x20address\x20\x3d\x20int\x28self.memory_address_entry.get\x28\x29,\x2016\x29\n\x20\x20\x20\x20\x20\x20data_type\x20\x3d\x20self.data_type_combobox.get\x28\x29\n\x20\x20\x20\x20\x20\x20new_value\x20\x3d\x20self.new_value_entry.get\x28\x29\n\n\x20\x20\x20\x20\x20\x20process_handle\x20\x3d\x20self.modifier.open_process\x28pid\x29\n\n\x20\x20\x20\x20\x20\x20if\x20data_type\x20\x3d\x3d\x20"int":\n\x20\x20\x20\x20\x20\x20\x20\x20self.modifier.write_memory\x28process_handle,\x20address,\x20int\x28new_value\x29\x29\n\x20\x20\x20\x20\x20\x20elif\x20data_type\x20\x3d\x3d\x20"float":\n\x20\x20\x20\x20\x20\x20\x20\x20self.modifier.write_memory\x28process_handle,\x20address,\x20ctypes.c_float\x28float\x28new_value\x29\x29\x29\n\x20\x20\x20\x20\x20\x20else:\n\x20\x20\x20\x20\x20\x20\x20\x20self.modifier.write_memory\x28process_handle,\x20address,\x20new_value.encode\x28\x29\x29\n\n\x20\x20\x20\x20\x20\x20messagebox.showinfo\x28"成功",\x20"内存值已修改"\x29\n\x20\x20\x20\x20except\x20OSError\x20as\x20e:\n\x20\x20\x20\x20\x20\x20messagebox.showerror\x28"错误",\x20str\x28e\x29\x29\n\x20\x20\x20\x20except\x20ValueError:\n\x20\x20\x20\x20\x20\x20messagebox.showerror\x28"错误",\x20"请输入有效的进程ID和内存地址"\x29\n\x20\x20\x20\x20finally:\n\x20\x20\x20\x20\x20\x20self.modifier.close_process\x28process_handle\x29\n\n\ndef\x20start_application\x28\x29:\n\x20\x20window\x20\x3d\x20tk.Tk\x28\x29\n\n\x20\x20game_data_modifier_gui\x20\x3d\x20GameDataModifierGUI\x28window\x29\n\n\x20\x20window.mainloop\x28\x29\n\n\nif\x20__name__\x20\x3d\x3d\x20"main":\n\x20\x20start_application\x28\x29
原文地址: https://www.cveoy.top/t/topic/quNy 著作权归作者所有。请勿转载和采集!