当前位置:   article > 正文

使用Python对植物大战僵尸学习研究_基于python植物大战僵尸论文

基于python植物大战僵尸论文

根据上一篇 使用使用Python学习win32库进行内存读写 中,使用Python win32库,对一款游戏进行了读内存 操作。

今天来写一下对内存进行写的操作
在这里插入图片描述

正文

要进行32位的读写,首先了解一下要用到的几个函数,通过百度找到的,大多都是C/C++的资料。

更详细的分析看上一篇。

写入函数 是 WriteProcessMemory

此函数能写入某一进程的内存区域(直接写入会出Access Violation错误,故需此函数)。
  • 1

VC++声明

BOOL WriteProcessMemory(
HANDLE hProcess,//要修改的进程内存的句柄。句柄必须具有对进程的进程_vm_写和进程_vm_操作的访问权限
LPVOID lpBaseAddress,//指向写入数据的指定进程中的基地址的指针。在进行数据传输之前,系统将验证指定大小的基址和内存中的所有数据都可用于写访问,如果无法访问,则函数将失败。
LPVOID lpBuffer,//指向缓冲区的指针,其中包含要在指定进程的地址空间中写入的数据
DWORD nSize,//要写入指定进程的字节数。
LPDWORD lpNumberOfBytesWritten//指向接收传输到指定进程的字节数的变量的指针。此参数是可选的。如果lpNumberOfBytesWritten是零,则忽略该参数。
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

返回值

如果函数成功,则返回值为非零
如果函数失败,则返回值为0(零)。若要获取扩展错误信息,请调用GetLastError,如果请求的写操作跨入进程中无法访问的区域,则函数将失败。

对单机植物大战僵尸进行读取与写入操作

对植物大战僵尸分析,请看

植物大战僵尸(1)

植物大战僵尸(2)

植物大战僵尸(3)

首先是对阳光数量的读取

阳光的基址偏移是:

阳光:PlantsVsZombies.exe+2A9EC0+768+5560   

不能直接读PlantsVsZombies.exe+2A9EC0,所以把该值添加到CE中,查看地址栏中的十六进制值 006A9EC0
  • 1
  • 2
  • 3

在这里插入图片描述
读写操作,与上一篇文章写法相似

# -*- coding: utf-8 -*-
import win32process#进程模块
from win32con import PROCESS_ALL_ACCESS #Opencress 权限
import win32api#调用系统模块
import ctypes#C语言类型
from win32gui import FindWindow#界面

def GetProcssID(address,bufflength):
    pid = ctypes.c_ulong()
    kernel32 = ctypes.windll.LoadLibrary("kernel32.dll")
    hwnd = FindWindow(None,u"植物大战僵尸中文版")
    ReadProcessMemory = kernel32.ReadProcessMemory
    hpid, pid = win32process.GetWindowThreadProcessId(hwnd)
    hProcess = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid)
    addr = ctypes.c_ulong()
    ReadProcessMemory(int(hProcess), address, ctypes.byref(addr), bufflength, None)
    win32api.CloseHandle(hProcess)
    return addr.value


def main():
    sun = GetProcssID(GetProcssID(GetProcssID(0x006A9EC0, 4)+0x768, 4)+0x5560, 4)

    print ("阳光的数量:%d" % sun)

if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

sun 分解写法:

def main():
   	ret  = GetProcssID(0x006A9EC0,4)
    ret2 = GetProcssID(ret+0x768,4)
    sun = GetProcssID(ret2+0x5560,4)
    print ("阳光的数量:%d" % sun)
    #sun = GetProcssID(GetProcssID(GetProcssID(0x006A9EC0, 4)+0x768, 4)+0x5560, 4)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

根据之前的分析,植物大战僵尸可以开启自动收集功能。具体的地址是

自动收集:PlantsVsZombies.exe+3158B   初始值:5274496  修改后:22051712
		十六进制:0043158B
  • 1
  • 2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/413795
推荐阅读
相关标签
  

闽ICP备14008679号