You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:54:04