不要迷恋我,虽然我利用Python来耍植物大战僵尸

news/2025/2/2 3:04:30/

目录

前言

游戏的安装

思路

      一句话总结

      大概的思路

实战

        确定修改哪一款游戏的数据

        代码

       地址的寻找

        视频教程

       修改数据 

         代码

效果

完整的源码 


前言

        大家好,我叫善念。上篇文章我许了一个愿,就是想让大家多多关注我,然后我的粉丝就蹭蹭的涨了好几百,谢谢大家的厚爱。可是我发现粉丝是涨了,三连变少了,谢谢大家这次给我三连,我一定再接再厉。有问题留在评论区,我会一一回复,谢谢大家!

         

        这次要做的是修改一款单机游戏的数据,学过C语言的朋友肯定经常会看到有些老师讲这个案例,就是《植物大战僵尸》这个课题,不过此文我将带大家利用Python来实现(2019原创课题,附视频教程)。

游戏的安装

        关于安装的这一块....我以前是在网站上下载的,现在再去找估计随便百度下载一个就可以了,这里就用我之前的吧

        安装下载后切记要避免点到一些广告上去,和一些浏览器的锁定勾选记得取消掉。 进入游戏是全屏,不方便我们观察效果以及编写程序,可以在选项中取消勾选全屏

思路

      一句话总结

                我的理解就是,所有的程序的本质都是变量与数值的集合。 

                比如说咱们玩的游戏它也是一个程序吧,游戏的角色血量、蓝条是不是都是一个数值储存在变量内,那么如果我们找到存放这个数值的变量(也可以叫做地址),修改这个变量的值,那么是不是就可以做到给咱们得人物加血量、修改人物等级的一系列操作。

      大概的思路

                 首先确定修改哪一款游戏的数据,然后确定修改游戏的哪一个数据,然后去寻找这个游戏内这个数据的地址,然后去修改这个数据。

                听起来有点绕。好吧,是我的语文学习的太差啦

实战

        确定修改哪一款游戏的数据

                这里需要利用到一个句柄查看工具。

                把放大镜拖动到游戏的标题上,就可以查看到这个窗口的所有信息

       

         可以看下咱们任务管理器中的进程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软件。

        视频教程

Python永远的神,实战开发游戏内存辅助!

                

       修改数据 

                由于咱们是用Python这门编程语言来实现的,这里需要用Python去调C,用到动态链接库,所以要配置一下内核模块(动态链接库kernel32.dll),C:\Windows\System32\kernel32.dll放到这个目录下。

               代码

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))
# 关闭进程


http://www.ppmy.cn/news/579492.html

相关文章

植物大战僵尸中文年度版

中文年度版 基址:007794f8阳光8685578金钱95050 冒险模式9504C 智慧树95011C 其他模式 91c 花肥 950 220 杀虫剂950 224 巧克力950 250 树肥950 258 复制代码 鼠标状态 868 150 30 植物栏格数:868 15c 24 植物当前冷却值:868 15c 4c 植物冷却时间:868 15c 50 植物栏列表:868 15…

植物大战僵尸年度版下载 (官方中文去广告版,可玩性提升!)

植物大战僵尸年度版下载 (官方中文去广告版,可玩性提升!) [ 游戏娱乐 ] 植物大战僵尸绝对是过去一年最火最受欢迎的小游戏了,可爱的造型加上非常有挑战性对抗还有持续不断的新鲜感,无论是小孩还是大人,无聊是GG还是MM…

《植物大战僵尸》简体中文版 下载地址 大小:52.6MB

操作鼠标操作,这个首先要种向日葵。这个是最重要的。先种两到三个,这时候差不多僵尸就开始进攻了。这时候先看看僵尸是从那条路来的,先放豌豆在那里守着,然后再种向日葵最好一排。介绍严重推荐,非常好玩!植…

steam植物大战僵尸汉化补丁使用教程

植物大战僵尸作为小时候印象最深的游戏之一,上线便收获了一大波人的喜爱与好评,仍至今日,还有许多小伙本们沉浸其中,不过steam版本并不支持简体中文语言,网络上面虽然一大堆但都是很久之前的,会出现一些黑屏…

经典而又耐玩的游戏——植物大战僵尸 绿色中文版(免安装)

经典而又耐玩的游戏——植物大战僵尸 绿色中文版(免安装) 今天Yongd推荐大家一款超经典而又耐玩的游戏——植物大战僵,网络上对这个游戏的介绍和玩法早已是铺天盖地,而偶写这边文章的目的是把这款游戏介绍给那些还没有玩过的朋友们,这么一款打…

电力智能运维是什么?有哪些优势?

设备检修维护是指对设备和系统进行必要的监视、维修和养护,通过日常的维护使设备保持良好的状态,确保设备安全、稳定、经济运行。由于时代的变迁,电力设备的检测维修变得也越来越智能化。采用的智能运维系统,可以更好的监控电力设…

wpf中使用d3d

微软官方文档

d3d9 抓取windows屏幕

抓取桌面的几种方式里面,有GDI,direct3d, win10 的DXGI ,等等 以下代码已经在gitee上,使用direct3d方式抓屏,保存png方式图片,可自行下载,代码里面还有一些抓取音频的,这…