一.读写内存所需的基本参数
接下来我将使用GTA5游戏举例
1.通过进程名称获取进程pid
from psutil import process_iter
def get_process_id_by_name(process_name):
for process in process_iter(["pid", "name"]):
if process.info["name"] == process_name:
return process.info["pid"]
return None
注意进程名称和游戏名称不一样,如下:
GTA5.exe是它的进程名称,Grand Theft Auto V则是它的游戏名称,在这里我们获取它的pid的使用的是进程名,也就是 GTA5.exe
2.通过pid获取进程句柄
我们要读写某个进程的时候,都必须先获取它的句柄,在python里面可以使用ctypes完成这一功能,代码如下:
import ctypes
PROCESS_ALL_ACCESS = 0x1F0FFF
#获取句柄
process = ctypes.windll.kernel32.OpenProcess(PROCESS_ALL_ACCESS, False, pid)
#关闭句柄
ctypes.windll.kernel32.CloseHandle(process)
3.游戏基地址
ce里面显示的绿色的地址,都是游戏基地址+一些偏移量构成的地址,这些我们也可以称为基地址。如下所示:
所以图中的 GTA5.exe 则是游戏真正的基地址,那么加号后面的十六进制的数,就是偏移量。这种类型构成的地址都可以称为基地址,但是真正的基地址就一个 那就是 GTA5.exe
这里ce没有显示GTA5.exe的地址,是因为ce自动给游戏基地址用进程名注册了符号,代替了它的地址。我们可以手动添加,看到GTA5.exe指代的地址具体是什么。如下所示:
所以7FF7C3020000就是游戏的基地址,那我们如何使用python获取游戏的基地址呢?如下所示:
#方法一:使用win32api的库
import ctypes
from psutil import process_iter
from win32process import EnumProcessModules
from win32api import OpenProcess, CloseHandle
PROCESS_ALL_ACCESS = 0x1F0FFF
def get_base_address_by_pid(pid):
try:
process_handle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
base_address = EnumProcessMo