工具:
CE
python
一、寻找基址
首先打开CE和游戏,把游戏附加上去
首先我们查找阳光值,这里是50
查找到有12013条,我们通过修改阳光值再次扫描来减少结果,这里一次就只剩一个了
通过Ctrl+F5来看看谁访问了这个地址
这里我们看到他有一个偏移量,是5578,EDX的地址为32DE0D38,我们重新查找一下这个地址,注意要勾上16进制
我们找到47个结果,它没有减少了,我们来一个一个看一下
找到这个很像,我们来看一下
可以看到偏移量为868,地址为027B9ED8重复刚才的操作
这里有四个基址,应该就在这里面了,通过手动添加地址看能不能反推到阳光值,
我们得到了这个阳光值,并且修改数值,阳光值也变化了,可以确定,这个00755E0C就是我们要找的基址,后面进入代码阶段
二、写代码
有了上面找的基址和偏移量,代码就可以这么写:
# -*- coding: utf-8 -*-
# Name: 1
# Description:
# Author: XueCheng Wang
# Date: 2020/5/7
import win32gui
import win32api
import win32process
import ctypes #c/c++语言调用
# 修改阳光值
def sun(process_handle):
# 调用动态连接库
kernel32 = ctypes.windll.LoadLibrary(r"./kernel32.dll")
data1 = ctypes.c_long()
kernel32.ReadProcessMemory(int(process_handle), 0x00755E0c, ctypes.byref(data1), 4, None)
data2 = ctypes.c_long()
kernel32.ReadProcessMemory(int(process_handle), data1.value + 0x868, ctypes.byref(data2), 4, None)
SUN = ctypes.c_long(int(1000))
kernel32.WriteProcessMemory(int(process_handle), data2.value + 0x5578, ctypes.byref(SUN), 4, None)
if __name__ == '__main__':
# 获取窗口句柄
Hwnd = win32gui.FindWindow("MainWindow","Plants vs. Zombies")
# 获取进程id
process_id = win32process.GetWindowThreadProcessId(Hwnd)[1]
# 获取进程句柄
process_handle = win32api.OpenProcess(0x1F0FFF,False,process_id)
# 无限阳光
sun(process_handle)
这样就实现了植物大战僵尸的阳光修改,加上界面