不要迷戀我,我只是利用Python修改了遊戲記憶體
前言
大家好,我叫善念。上篇文章我許了一個願,就是想讓大家多多關注我,然後我的粉絲就蹭蹭地漲了好幾百,謝謝大家的厚愛。可是我發現粉絲是漲了,三連變少了,謝謝大家這次給我三連,我一定再接再厲。有問題留在評論區,我會一一回復,謝謝大家!
很多人學習python,不知道從何學起。 很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。 很多已經做案例的人,卻不知道如何去學習更加高深的知識。 那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼! QQ群:861355058 歡迎加入,一起討論 一起學習!
這次要做的是修改一款單機遊戲的資料,學過C語言的朋友肯定經常會看到有些老師講這個案例,就是《植物大戰殭屍》這個課題,不過此文我將帶大家利用Python來實現(2019原創課題,附視訊教程)。
遊戲的安裝
關於安裝的這一塊....我以前是在網站上下載的,現在再去找估計隨便百度下載一個就可以了,這裡就用我之前的吧
連結:
https://pan.baidu.com/s/1MviRuMQtKZECeYVDRZxcHw
提取碼:9pfz
安裝下載後切記要避免點到一些廣告上去,和一些瀏覽器的鎖定勾選記得取消掉。 進入遊戲是全屏,不方便我們觀察效果以及編寫程式,可以在選項中取消勾選全屏
思路
一句話總結
我的理解就是,所有的程式的本質都是變數與數值的集合。
比如說咱們玩的遊戲它也是一個程式吧,遊戲的角色血量、藍條是不是都是一個數值儲存在變數內,那麼如果我們找到存放這個數值的變數(也可以叫做地址),修改這個變數的值,那麼是不是就可以做到給咱們得人物加血量、修改人物等級的一系列操作。
大概的思路
首先確定修改哪一款遊戲的資料,然後確定修改遊戲的哪一個資料,然後去尋找這個遊戲內這個資料的地址,然後去修改這個資料。
聽起來有點繞。好吧,是我的語文學習得太差啦
實戰
確定修改哪一款遊戲的資料
這裡需要利用到一個控制代碼檢視工具這裡我給大家已經下載好了。
連結:
https://pan.baidu.com/s/1mUJ9Y8LntOsg0Vt9J0YMnA
提取碼:4f7h
把放大鏡拖動到遊戲的標題上,就可以檢視到這個視窗的所有資訊
可以看下咱們工作管理員中的程序ID是否也是39156
程式碼
import win32process # 程序模組 importwin32gui # 介面 # 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/1e0hRCK323Hiq3TM_lwBL4g
提取碼:5e0r
視訊教程
Python永遠的神,實戰開發遊戲記憶體輔助!
修改資料
由於咱們是用Python這門程式語言來實現的,這裡需要用Python去調C,用到動態連結庫,所以要配置一下核心模組(動態連結庫kernel32.dll),C:\Windows\System32\kernel32.dll放到這個目錄下,我這裡也給大家下載好了。
連結:
https://pan.baidu.com/s/1idc_lYgqoqeJGrrjSw7tsg
提取碼:zo2g
程式碼
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/1I-rHc4fZRoPEYAqffnSrCQ
提取碼:61us