Python修改游戲內(nèi)存的方法
前言
大家好,我叫善念。上篇文章我許了一個(gè)愿,就是想讓大家多多關(guān)注我,然后我的粉絲就蹭蹭的漲了好幾百,謝謝大家的厚愛??墒俏野l(fā)現(xiàn)粉絲是漲了,三連變少了,謝謝大家這次給我三連,我一定再接再厲。有問題留在評論區(qū),我會一一回復(fù),謝謝大家!
這次要做的是修改一款單機(jī)游戲的數(shù)據(jù),學(xué)過C語言的朋友肯定經(jīng)常會看到有些老師講這個(gè)案例,就是《植物大戰(zhàn)僵尸》這個(gè)課題,不過此文我將帶大家利用Python來實(shí)現(xiàn)(2019原創(chuàng)課題,附視頻教程)。
游戲的安裝
關(guān)于安裝的這一塊....我以前是在網(wǎng)站上下載的,現(xiàn)在再去找估計(jì)隨便百度下載一個(gè)就可以了,這里就用我之前的吧
鏈接:https://pan.baidu.com/s/1Ydiy1Q9QqKNxoyAkIlzp7Q
提取碼:1234
安裝下載后切記要避免點(diǎn)到一些廣告上去,和一些瀏覽器的鎖定勾選記得取消掉。 進(jìn)入游戲是全屏,不方便我們觀察效果以及編寫程序,可以在選項(xiàng)中取消勾選全屏
思路
一句話總結(jié)
我的理解就是,所有的程序的本質(zhì)都是變量與數(shù)值的集合。
比如說咱們玩的游戲它也是一個(gè)程序吧,游戲的角色血量、藍(lán)條是不是都是一個(gè)數(shù)值儲存在變量內(nèi),那么如果我們找到存放這個(gè)數(shù)值的變量(也可以叫做地址),修改這個(gè)變量的值,那么是不是就可以做到給咱們得人物加血量、修改人物等級的一系列操作。
大概的思路
首先確定修改哪一款游戲的數(shù)據(jù),然后確定修改游戲的哪一個(gè)數(shù)據(jù),然后去尋找這個(gè)游戲內(nèi)這個(gè)數(shù)據(jù)的地址,然后去修改這個(gè)數(shù)據(jù)。
聽起來有點(diǎn)繞。好吧,是我的語文學(xué)習(xí)的太差啦
實(shí)戰(zhàn)
確定修改哪一款游戲的數(shù)據(jù)
這里需要利用到一個(gè)句柄查看工具這里我給大家已經(jīng)下載好了。
鏈接:https://pan.baidu.com/s/1ubpe7bmIsojbcX3z_24CxA
提取碼:1234
把放大鏡拖動(dòng)到游戲的標(biāo)題上,就可以查看到這個(gè)窗口的所有信息
可以看下咱們?nèi)蝿?wù)管理器中的進(jìn)程ID是否也是39156
代碼
import win32process # 進(jìn)程模塊 import win32gui # 界面 # none 窗口的類名 窗口的ID window_handle = win32gui.FindWindow(None, "植物大戰(zhàn)僵尸中文版") #Pyspy++ 窗口句柄win32gui. print(window_handle) process_id = win32process.GetWindowThreadProcessId(window_handle)[1] #取進(jìn)程ID print(process_id) process_handle = win32api.OpenProcess(0x1F0FFF, False, process_id)#進(jìn)程句柄 # 進(jìn)程句柄是否可以被子進(jìn)程繼承,一般選false(不可被繼承) # #這種是用線程內(nèi)核對象的默認(rèn)安全屬性, 子進(jìn)程不能繼承父進(jìn)程的句柄,不可以繼承, # 則子進(jìn)程是不可以通過句柄訪問改內(nèi)核對象。 print(process_handle)
關(guān)于這個(gè)代碼我講解一下 ,如何確定一款游戲是由進(jìn)程的句柄來判斷的,而我們手動(dòng)取到游戲的窗口ID 與類名后,可以得到進(jìn)程ID,由進(jìn)程ID可以得到游戲句柄。
地址的尋找
陽光總值150, 種植一個(gè)豌豆需要100,非常不夠用。咱們現(xiàn)在需要實(shí)現(xiàn)的功能是無限陽光,達(dá)到無限種植豌豆的效果。這里需要用到CE軟件,我給大家提供。
鏈接:https://pan.baidu.com/s/1mkEmVUonDBS6zBjJjYDFSQ
提取碼:1234
視頻教程
Python永遠(yuǎn)的神,實(shí)戰(zhàn)開發(fā)游戲內(nèi)存輔助!
修改數(shù)據(jù)
由于咱們是用Python這門編程語言來實(shí)現(xiàn)的,這里需要用Python去調(diào)C,用到動(dòng)態(tài)鏈接庫,所以要配置一下內(nèi)核模塊(動(dòng)態(tài)鏈接庫kernel32.dll),C:\Windows\System32\kernel32.dll放到這個(gè)目錄下,我這里也給大家下載好了。
鏈接:https://pan.baidu.com/s/1kAwg7PE_zZP_sqkaluD4QA
提取碼:1234
代碼
import win32api # 系統(tǒng)模塊 import win32process # 進(jìn)程模塊 import win32gui # 界面 import ctypes # C語言調(diào)用類型 # python中使用ctypes模塊可以在python中直接調(diào)用C/C++。首先要將C/C++編譯成動(dòng)態(tài)庫 # (.dl或.so),之后python中調(diào)用即可。 # C類型 調(diào)用約定 # 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 ")#加載內(nèi)核模塊 動(dòng)態(tài)鏈接庫 date1 = ctypes.c_long() kernel32.ReadProcessMemory(int(process_handle),0x006A9EC0,ctypes.byref(date1),4,None)#None讀取的一個(gè)數(shù)據(jù)的大小 尺寸 長度 # 緩沖區(qū),各種語言的文本要求不一樣,為了兼容,那么自定義一個(gè)文本 # 地址會變,但是里面存儲的數(shù)據(jù)不會變。 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) # 關(guān)閉進(jìn)程 kernel32.CloseHandle(int(process_handle))
效果
完整的源碼
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2019/4/30 16:00 # @Author : 善念 import win32api # 系統(tǒng)模塊 import win32process # 進(jìn)程模塊 import win32gui # 界面 import ctypes # C語言調(diào)用類型 # python中使用ctypes模塊可以在python中直接調(diào)用C/C++。首先要將C/C++編譯成動(dòng)態(tài)庫 # (.dl或.so),之后python中調(diào)用即可。 # none 窗口的類名 窗口的ID window_handle = win32gui.FindWindow(None, "植物大戰(zhàn)僵尸中文版") #Pyspy++ 窗口句柄win32gui. print(window_handle) process_id = win32process.GetWindowThreadProcessId(window_handle)[1] #取進(jìn)程ID print(process_id) process_handle = win32api.OpenProcess(0x1F0FFF, False, process_id)#進(jìn)程句柄 # 進(jìn)程句柄是否可以被子進(jìn)程繼承,一般選false(不可被繼承) # #這種是用線程內(nèi)核對象的默認(rèn)安全屬性, 子進(jìn)程不能繼承父進(jìn)程的句柄,不可以繼承, # 則子進(jìn)程是不可以通過句柄訪問改內(nèi)核對象。 print(process_handle) # C類型 調(diào)用約定 # 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 ")#加載內(nèi)核模塊 動(dòng)態(tài)鏈接庫 date1 = ctypes.c_long() kernel32.ReadProcessMemory(int(process_handle),0x006A9EC0,ctypes.byref(date1),4,None)#None讀取的一個(gè)數(shù)據(jù)的大小 尺寸 長度 # 緩沖區(qū),各種語言的文本要求不一樣,為了兼容,那么自定義一個(gè)文本 # 地址會變,但是里面存儲的數(shù)據(jù)不會變。 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)) # 關(guān)閉進(jìn)程
所有的軟件下載包
鏈接:https://pan.baidu.com/s/18le7cp6i5OF6_Qhcj-BLFg
提取碼:1234
到此這篇關(guān)于Python修改游戲內(nèi)存的方法的文章就介紹到這了,更多相關(guān)Python 修改游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)報(bào)警信息實(shí)時(shí)發(fā)送至郵箱功能(實(shí)例代碼)
這篇文章主要介紹了Python實(shí)現(xiàn)報(bào)警信息實(shí)時(shí)發(fā)送至郵箱,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11CentOS 7下安裝Python 3.5并與Python2.7兼容并存詳解
這篇文章主要給大家介紹了在CentOS 7下安裝Python 3.5并與Python2.7兼容并存的相關(guān)資料,文中將安裝步驟介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07Python運(yùn)行時(shí)修改業(yè)務(wù)SQL代碼
這篇文章主要介紹了Python運(yùn)行時(shí)修改業(yè)務(wù)SQL代碼,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06python中pytest收集用例規(guī)則與運(yùn)行指定用例詳解
這篇文章主要介紹了python中pytest收集用例規(guī)則與運(yùn)行指定用例詳解,天會講解一下pytest是如何收集我們寫好的用例?我們又有哪些方式來運(yùn)行單個(gè)用例或者批量運(yùn)行用例呢,需要的朋友可以參考下2019-06-06Django配置celery(非djcelery)執(zhí)行異步任務(wù)和定時(shí)任務(wù)
這篇文章主要介紹了Django配置celery(非djcelery)執(zhí)行異步任務(wù)和定時(shí)任務(wù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07python?tkinter實(shí)現(xiàn)彈窗的輸入輸出
這篇文章主要為大家詳細(xì)介紹了python?tkinter實(shí)現(xiàn)彈窗的輸入輸出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02