目录
  • 前言
  • 游戏的安装
  • 思路
    • 一句话总结
    • 大概的思路
  • 实战
    • 确定修改哪一款游戏的数据
      • 代码
    • 地址的寻找
      • 视频教程
    • 修改数据
      • 代码
  • 效果
    • 完整的源码
      • 所有的软件下载包

        前言

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

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

        到此这篇关于python修改游戏内存的方法的文章就介绍到这了,更多相关python 修改游戏内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!