avatar

目录
使用Python读写游戏1(口xx游)


前言:

上一周,在52的精华帖中,看到有位大佬用Python制作了鬼泣5的修改器,看完才知道,原来Python也可以对内存进行操作,出于对技术的好奇,看完以后,决定自己也尝试一下。

要用到的工具:
CE,Ollybdg,

用Python,读取这款游戏中,人物的血量。

先打开游戏吧,打开CE,对游戏附加。

输入199在输入框中,先进行一次扫描

接着去打怪,扣血以后在进行一次扫描

等一会,人物会自动回血,然后你会神奇的发现,这两个数据中有一个的数值会变成199,然后上次数值哪里显示198,那就是我们要找的数据

26B871F0

打开OD,把地址放在里面搜索,断点,然后使用巴拉拉魔法力量,找出偏移量
[[[[D0DF1C]+1C]+28]+288]

……………………………………………………………………………………………………………………………………………………………

现在开始进入Python

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

FindWindowA在Python中为FindWindow

FindWindow这个函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串。这个函数不搜索子窗口。

Code
1
2
3
4
HWND FindWindowA(
LPCSTR lpClassName,//窗口类名
LPCSTR lpWindowName//窗口名称,例如计算器
);

GetWindowThreadProcessId

在得到窗口句柄后我们可以通过GetWindowThreadProcessId这个函数来获得窗口所属进程ID和线程ID,从而判断创建窗口的进程和线程。

Code
1
2
3
4
DWORD GetWindowThreadProcessId(
HWND hWnd, //传入的窗口句柄
LPDWORD lpdwProcessId //返回的进程ID地址。
);

OpenProcess

OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。

Code
1
2
3
4
5
HANDLE OpenProcess(
DWORD dwDesiredAccess, //想拥有的该进程访问权限
BOOL bInheritHandle,//表示所得到的进程句柄是否可以被继承
DWORD dwProcessId//被打开进程的PID
);

ReadProcessMemory

是一个内存操作函数, 其作用为根据进程句柄读入该进程的某个内存空间;函数原型为BOOL. 当函数读取成功时返回1, 失败则返回0

Code
1
2
3
4
5
6
7
BOOL ReadProcessMemory(
HANDLE hProcess, //进程句柄
LPCVOID lpBaseAddress,//读出数据的地址
LPVOID lpBuffer,//存放读取数据的地址
SIZE_T nSize,//读出的数据大小
SIZE_T *lpNumberOfBytesRead//数据的实际大小
);

首先导入模块

Code
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
28
29
30
31
32
33
34
# -*- 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() // 设置 pid 为 无符号单精度类型
kernel32 = ctypes.windll.LoadLibrary("kernel32.dll")//加载动态链接库
hwnd = FindWindow("XYElementClient Window", u"口袋西游")//获取窗口句柄
hpid, pid = win32process.GetWindowThreadProcessId(hwnd)//获取窗口ID
hProcess = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid)//获取进程句柄
ReadProcessMemory = kernel32.ReadProcessMemory
addr = ctypes.c_ulong()
ReadProcessMemory(int(hProcess), address, ctypes.byref(addr), bufflength, None)//读内存
win32api.CloseHandle(hProcess)//关闭句柄
return addr.value

def main():
addr = GetProcssID(0xD0DF1C, 4)
ret = addr + 0x1C
ret2 = GetProcssID(ret, 4)
ret3 = ret2 + 0x28
ret4 = GetProcssID(ret3, 4)
ret5 = ret4 + 0x288
ret6 = GetProcssID(ret5, 4) // 传入偏移地址
print ("Hp:%d" % ret6)


if __name__ == '__main__':
main()
ReadProcessMemory(int(hProcess), address, ctypes.byref(addr), bufflength, None)

参数解析:1.传入进程句柄 2.地址,就是血量的地址,那几条偏移. 3. 第三个要传入指针 。4.长度

运行结果:

文章作者: KeyboArd
文章链接: https://www.wrpzkb.cn/PythonFxGame1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KeyboArd's Blog
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论