1. 程式人生 > 其它 >不要迷戀我,我只是利用Python修改了遊戲記憶體

不要迷戀我,我只是利用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
# 程序模組
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/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