Python修改遊戲內存的方法
前言
大傢好,我叫善念。上篇文章我許瞭一個願,就是想讓大傢多多關註我,然後我的粉絲就蹭蹭的漲瞭好幾百,謝謝大傢的厚愛。可是我發現粉絲是漲瞭,三連變少瞭,謝謝大傢這次給我三連,我一定再接再厲。有問題留在評論區,我會一一回復,謝謝大傢!
這次要做的是修改一款單機遊戲的數據,學過C語言的朋友肯定經常會看到有些老師講這個案例,就是《植物大戰僵屍》這個課題,不過此文我將帶大傢利用Python來實現(2019原創課題,附視頻教程)。
遊戲的安裝
關於安裝的這一塊….我以前是在網站上下載的,現在再去找估計隨便百度下載一個就可以瞭,這裡就用我之前的吧
鏈接:https://pan.baidu.com/s/1Ydiy1Q9QqKNxoyAkIlzp7Q
提取碼:1234
安裝下載後切記要避免點到一些廣告上去,和一些瀏覽器的鎖定勾選記得取消掉。 進入遊戲是全屏,不方便我們觀察效果以及編寫程序,可以在選項中取消勾選全屏
思路
一句話總結
我的理解就是,所有的程序的本質都是變量與數值的集合。
比如說咱們玩的遊戲它也是一個程序吧,遊戲的角色血量、藍條是不是都是一個數值儲存在變量內,那麼如果我們找到存放這個數值的變量(也可以叫做地址),修改這個變量的值,那麼是不是就可以做到給咱們得人物加血量、修改人物等級的一系列操作。
大概的思路
首先確定修改哪一款遊戲的數據,然後確定修改遊戲的哪一個數據,然後去尋找這個遊戲內這個數據的地址,然後去修改這個數據。
聽起來有點繞。好吧,是我的語文學習的太差啦
實戰
確定修改哪一款遊戲的數據
這裡需要利用到一個句柄查看工具這裡我給大傢已經下載好瞭。
鏈接:https://pan.baidu.com/s/1ubpe7bmIsojbcX3z_24CxA
提取碼:1234
把放大鏡拖動到遊戲的標題上,就可以查看到這個窗口的所有信息
可以看下咱們任務管理器中的進程ID是否也是39156
代碼
import win32process # 進程模塊 import win32gui # 界面 # none 窗口的類名 窗口的ID window_handle = win32gui.FindWindow(None, "植物大戰僵屍中文版") #Pyspy++ 窗口句柄win32gui. print(window_handle) process_id = win32process.GetWindowThreadProcessId(window_handle)[1] #取進程ID print(process_id) process_handle = win32api.OpenProcess(0x1F0FFF, False, process_id)#進程句柄 # 進程句柄是否可以被子進程繼承,一般選false(不可被繼承) # #這種是用線程內核對象的默認安全屬性, 子進程不能繼承父進程的句柄,不可以繼承, # 則子進程是不可以通過句柄訪問改內核對象。 print(process_handle)
關於這個代碼我講解一下 ,如何確定一款遊戲是由進程的句柄來判斷的,而我們手動取到遊戲的窗口ID 與類名後,可以得到進程ID,由進程ID可以得到遊戲句柄。
地址的尋找
陽光總值150, 種植一個豌豆需要100,非常不夠用。咱們現在需要實現的功能是無限陽光,達到無限種植豌豆的效果。這裡需要用到CE軟件,我給大傢提供。
鏈接:https://pan.baidu.com/s/1mkEmVUonDBS6zBjJjYDFSQ
提取碼:1234
視頻教程
Python永遠的神,實戰開發遊戲內存輔助!
修改數據
由於咱們是用Python這門編程語言來實現的,這裡需要用Python去調C,用到動態鏈接庫,所以要配置一下內核模塊(動態鏈接庫kernel32.dll),C:\Windows\System32\kernel32.dll放到這個目錄下,我這裡也給大傢下載好瞭。
鏈接:https://pan.baidu.com/s/1kAwg7PE_zZP_sqkaluD4QA
提取碼:1234
代碼
import win32api # 系統模塊 import win32process # 進程模塊 import win32gui # 界面 import ctypes # C語言調用類型 # python中使用ctypes模塊可以在python中直接調用C/C++。首先要將C/C++編譯成動態庫 # (.dl或.so),之後python中調用即可。 # C類型 調用約定 # kernel32.WriteProcessMemory(int(process_handle),0x1C0A4F98,byref(c_int(1000)),4,byref(c_int(0))) kernel32 = ctypes.windll.LoadLibrary(r"C:\Windows\System32\kernel32.dll ")#加載內核模塊 動態鏈接庫 date1 = ctypes.c_long() kernel32.ReadProcessMemory(int(process_handle),0x006A9EC0,ctypes.byref(date1),4,None)#None讀取的一個數據的大小 尺寸 長度 # 緩沖區,各種語言的文本要求不一樣,為瞭兼容,那麼自定義一個文本 # 地址會變,但是裡面存儲的數據不會變。 print(date1.value) date2 = ctypes.c_long() kernel32.ReadProcessMemory(int(process_handle),date1.value+0x768,ctypes.byref(date2),4,None) print(date2.value) date3 = ctypes.c_long() kernel32.ReadProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(date3),4,None) print(date3.value) sun = input("請輸入你要改變的陽光值:") # kernel32.WriteProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(ctypes.c_long(int(sun))),4,None) kernel32.WriteProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(ctypes.c_long(int(sun))), 4, None) # 關閉進程 kernel32.CloseHandle(int(process_handle))
效果
完整的源碼
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2019/4/30 16:00 # @Author : 善念 import win32api # 系統模塊 import win32process # 進程模塊 import win32gui # 界面 import ctypes # C語言調用類型 # python中使用ctypes模塊可以在python中直接調用C/C++。首先要將C/C++編譯成動態庫 # (.dl或.so),之後python中調用即可。 # none 窗口的類名 窗口的ID window_handle = win32gui.FindWindow(None, "植物大戰僵屍中文版") #Pyspy++ 窗口句柄win32gui. print(window_handle) process_id = win32process.GetWindowThreadProcessId(window_handle)[1] #取進程ID print(process_id) process_handle = win32api.OpenProcess(0x1F0FFF, False, process_id)#進程句柄 # 進程句柄是否可以被子進程繼承,一般選false(不可被繼承) # #這種是用線程內核對象的默認安全屬性, 子進程不能繼承父進程的句柄,不可以繼承, # 則子進程是不可以通過句柄訪問改內核對象。 print(process_handle) # C類型 調用約定 # kernel32.WriteProcessMemory(int(process_handle),0x1C0A4F98,byref(c_int(1000)),4,byref(c_int(0))) kernel32 = ctypes.windll.LoadLibrary(r"C:\Windows\System32\kernel32.dll ")#加載內核模塊 動態鏈接庫 date1 = ctypes.c_long() kernel32.ReadProcessMemory(int(process_handle),0x006A9EC0,ctypes.byref(date1),4,None)#None讀取的一個數據的大小 尺寸 長度 # 緩沖區,各種語言的文本要求不一樣,為瞭兼容,那麼自定義一個文本 # 地址會變,但是裡面存儲的數據不會變。 print(date1.value) date2 = ctypes.c_long() kernel32.ReadProcessMemory(int(process_handle),date1.value+0x768,ctypes.byref(date2),4,None) print(date2.value) date3 = ctypes.c_long() kernel32.ReadProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(date3),4,None) print(date3.value) sun = input("請輸入你要改變的陽光值:") # kernel32.WriteProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(ctypes.c_long(int(sun))),4,None) kernel32.WriteProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(ctypes.c_long(int(sun))), 4, None) kernel32.CloseHandle(int(process_handle)) # 關閉進程
所有的軟件下載包
鏈接:https://pan.baidu.com/s/18le7cp6i5OF6_Qhcj-BLFg
提取碼:1234
到此這篇關於Python修改遊戲內存的方法的文章就介紹到這瞭,更多相關Python 修改遊戲內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python 打印自己設計的字體的實例講解
- python調用dll出現精度問題解決
- python3使用libpcap庫進行抓包及數據處理的操作方法
- Python 自動喚醒窗口截圖腳本
- Python3 如何開啟自帶http服務