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

2023-10-27

目录

前言

游戏的安装

思路

      一句话总结

      大概的思路

实战

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

        代码

       地址的寻找

        视频教程

       修改数据 

         代码

效果

完整的源码 


前言

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

         

        这次要做的是修改一款单机游戏的数据,学过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))
# 关闭进程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不要迷恋我,虽然我利用Python来耍植物大战僵尸 的相关文章

  • Python:在列表理解本身中引用列表理解?

    这个想法刚刚出现在我的脑海中 假设您出于某种原因想要通过 Python 中的列表理解来获取列表的唯一元素 i if i in created comprehension else 0 for i in 1 2 1 2 3 1 2 0 0 3
  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class

随机推荐

  • 生产制造业ERP管理系统

    什么是生产制造业ERP管理系 生产制造业ERP管理系统的建设本身作为企业在发展过程当中重要的战略布局建设 涉及到各个不同的企业部门 涵盖了研发 生产 物流 财务等等 需要对这些团队进行一把手的领导 而且在企业整体发展过程当中 可以做好综合性
  • MongoDB以及MongoVUE的安装和使用

    环境安装 MongoDB的安装 下载mongoDB MongoDB官网地址 个人百度云盘地址 版本为 mongodb win32 x86 64 2008plus ssl v3 0 latest signed msi 安装 到这里mongod
  • Spring源码------IoC源码分析详解

    Spring源码 IoC源码分析详解 目录 Spring源码 IoC源码分析详解 1 控制反转 IoC 2 Spring IoC 源码时序图 详细版 3 源码追踪 3 1详细版链接 3 2 个人总结浓缩版 方便记忆 4 总结 1 控制反转
  • Oracle练习

    一 找到员工表中工资最高的前三名 降序排序 select from emp order by sal desc rownum 伪列 系统自动生成的一列 用来表示行号 rownum是Oracle中特有的用来表示行号的 默认值 起始值是 1 在
  • 打包神器webpack的一键式操作

    创建基本的webpack4 x项目 运行npm init y 快速初始化项目 在项目根目录创建src源代码目录和dist产品目录 在 src 目录下创建 index html 使用 cnpm 安装 webpack 运行cnpm i webp
  • ifconfig报错:SIOCSIFFLAGS: Operation not permitted

    insmod mt7601Usta ko rtusb init rt2870 gt usbcore registered new interface driver rt2870 iwconfiglo no wireless extensio
  • 深度学习实战29-AIGC项目:利用GPT-2(CPU环境)进行文本续写与生成歌词任务

    大家好 我是微学AI 今天给大家介绍一下深度学习实战29 AIGC项目 利用GPT 2 CPU环境 进行文本续写与生成歌词任务 在大家没有GPU算力的情况 大模型可能玩不动 推理速度慢 那么我们怎么才能跑去生成式的模型呢 我们可以试一下GP
  • AWS SAA-C03 #99

    A company is implementing a shared storage solution for a gaming application that is hosted in an on premises data cente
  • 宝塔部署前后端分离项目(Vue+SpringBoot)

    目录 后端部分 配置Redis 前端部分 后端部分 1 先修改自己的speingboot配置文件 我的是yml文件 保证宝塔上建的数据库和自己代码里 就是配置文件中所建的数据库的名字是一致的密码也要保持一致 Redis也一样 如果有的话 2
  • JavaAgent的那点秘密

    JavaAgent的那点秘密 前言 大家都知道Java文件编译成Class文件之后才能在Jvm中运行的 而Class文件自有一套规范 不必一定是Java文件经由javac编译产生 其它编程语言也可以直接生成Class文件交由Jvm运行 既然
  • android+多次开启服务,关于Android中的四大组件(Service的开启与封锁)

    关于Android中的四大组件 Service的开启与关闭 前言 服务 Service 是Android系统中的四大组件之一 服务主要用于两个目的 后台运行和跨进程访问 通过启动 一个服务 可以在不显示界面的前提下在后台运行指定的任务 这样
  • 2023 VScode安装教程【超详细】看这一篇就够了

    一 VScode下载 1 进入VScode官网 官网地址 https code visualstudio com 点击 Download 进入下载 不要点击 Download for Windows Stable Build 否则它会自动帮
  • Jboss历史漏洞利用 - JMX Console 未授权访问漏洞

    文章目录 环境搭建 漏洞简介 漏洞发现 漏洞利用 远程部署war包 GET SHELL 防护建议 环境搭建 docker搭建操作指南 docker search testjboss docker pull testjboss jboss d
  • 虚幻4 使用脚本编译自己的工程

    工程文件 Engine Source Programs AutomationTool AutomationTool Mono sln public static void Build BuildCommand Command Project
  • 【吐血整理】那些让你起飞的计算机基础知识:学什么,怎么学?

    作者 帅地 来源公众号 苦逼的码农 我公众号里的文章 写的大部分都是与计算机基础知识相关的 这些基础知识 就像我们的内功 如果在未来想要走的更远 这些内功是必须要修炼的 框架千变万化 而这些通用的底层知识 却是几乎不变的 了解了这些知识 可
  • 1.使用MySQL创建student表操作_实验环境Windows-SQLyog

    Student学生表 Name English Math Computer zhangsan 69 86 77 lisi 55 100 88 1 根据上面给出的表格 利用MySQL5 6设计出student学生表格 创建表的语法 CREAT
  • 项目集成支付宝报错:调试错误,请回到请求来源地,重新发起请求。 错误代码invalid-app-id错误原因:无效的ApplD参数

    问题 项目集成支付宝报错 调试错误 请回到请求来源地 重新发起请求 错误代码invalid app id错误原因 无效的ApplD参数 详细问题 笔者按照支付宝沙箱支付快速集成版进行操作 操作完成访问所集成的支付宝 页面如下 解决方案 修改
  • java math类随机数_Java—Math类和随机数类

    一 Math类 主要封装算数运算的静态方法 定义 Math是没有构造方法的 java语言中提供了一个执行数学基本运算的Math类 Math类包括常用的数学运算和一些数学函数 还提供了一些常用的常量 PI E等 Math类中提供了许多数学函数
  • MySql取消密码强度验证

    一 修改MySql配置文件 my cnf 一般情况下 MySql的配置文件 my cnf 会在 etc 目录下 如果没有 可以使用以下命令查找位置 sudo find name my cnf 编辑配置文件 sudo vi etc my cn
  • 不要迷恋我,虽然我利用Python来耍植物大战僵尸

    目录 前言 游戏的安装 思路 一句话总结 大概的思路 实战 确定修改哪一款游戏的数据 代码 地址的寻找 视频教程 修改数据 代码 效果 完整的源码 前言 大家好 我叫善念 上篇文章我许了一个愿 就是想让大家多多关注我 然后我的粉丝就蹭蹭的涨