使用dll基地址加偏移读取内存值始终返回0的问题如何解决
问题原因
你遇到的返回0的问题,通常是以下几个常见错误导致的:
- 硬编码了进程ID:代码里
get_process_by_id(4372)固定了进程ID,程序每次重启进程ID都会变化,大概率你运行代码时读取的是无效的、或者其他进程的内存,自然返回0。 - 硬编码了DLL基地址:你直接用了之前输出的
0x51250000作为固定基地址,但带动态基址(ASLR)的DLL每次程序启动时加载地址都会变化,硬编码的基地址只在你那次测试时有效,重启程序后就失效了。 - 偏移顺序错误:
ReadWriteMemory的get_pointer方法的偏移参数顺序需要和Cheat Engine中指针遍历的顺序完全一致,如果顺序写反会导致地址计算错误。 - 没有管理员权限:读写其他进程的内存需要脚本以管理员权限运行,权限不足时读取调用会失败,默认返回0。
- 读取数据类型不匹配:
read方法默认读取4字节有符号整数,如果你要读取的目标值是浮点数、8字节整数等其他类型,读取结果会不符合预期。
解决方法
把获取基地址和读取内存的逻辑合并,全程动态获取参数,同时添加必要的校验,修正后的参考代码如下:
import pymem from ReadWriteMemory import ReadWriteMemory # 动态配置参数,不要硬编码固定值 PROCESS_NAME = "PD.exe" DLL_NAME = "jvm.dll" BASE_OFFSET = 0x0036e654 # 偏移顺序和CE里的遍历顺序保持一致,不要写反 OFFSETS = [0x28, 0x1d0, 0x26, 0x3a, 0x12] # 1. 用pymem动态获取进程ID和DLL基地址 try: pm = pymem.Pymem(PROCESS_NAME) pid = pm.process_id base_address = pymem.process.module_from_name(pm.process_handle, DLL_NAME).lpBaseOfDll print(f"获取到进程PID: {pid}, {DLL_NAME} 基地址: {hex(base_address)}") except Exception as e: print(f"获取进程/基地址失败: {e}") exit(-1) # 2. 动态读取内存 rwm = ReadWriteMemory() try: process = rwm.get_process_by_id(pid) process.open() # 动态计算指针基址 pointer_base = base_address + BASE_OFFSET hp_pointer = process.get_pointer(pointer_base, offsets=OFFSETS) # 如果目标是浮点数,可指定参数:process.read(hp_pointer, is_float=True) hp = process.read(hp_pointer) print(f"读取到的值为: {hp}") except Exception as e: print(f"读取内存失败: {e}") finally: if 'process' in locals(): process.close()
运行脚本前右键点击终端/IDE,选择「以管理员身份运行」再执行代码即可。
内容的提问来源于stack exchange,提问作者Serveira
相关产品推荐
相关产品推荐

