纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

Python 修改游戏 Python修改游戏内存的方法

落伍的码农   2021-11-17 我要评论
想了解Python修改游戏内存的方法的相关内容吗落伍的码农在本文为您仔细讲解Python 修改游戏的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Python,修改游戏,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


相关文章

猜您喜欢

  • Go语言go build命令 Go语言基础go build命令用法及示例详解

    想了解Go语言基础go build命令用法及示例详解的相关内容吗枫少文在本文为您仔细讲解Go语言go build命令的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Go语言基础,Go语言go,build命令下面大家一起来学习吧..
  • Go语言基础go fmt命令 Go语言基础go fmt命令使用示例详解

    想了解Go语言基础go fmt命令使用示例详解的相关内容吗枫少文在本文为您仔细讲解Go语言基础go fmt命令的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Go语言基础,Go语言go,fmt命令下面大家一起来学习吧..

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式