CE Lua 进程选择、地址解析与内存读取
CE Lua 可以读取已经附加进程中的数据。本篇说明怎样核对目标、解析地址并检查读取结果,适合完成基础扫描的读者。
先确认附加对象
先打开官方 Tutorial,在 CE 主窗口选择它的进程,并用进程列表确认名称和进程 ID。openProcess(processid) 或 openProcess(processname) 可从 Lua 打开进程;名称可能对应多个实例,练习时优先在界面确认 PID。脚本不会自动证明目标是预期进程,目标退出或重启后也要重新附加。
解析地址
getAddressSafe("symbol") 无法解析时返回 nil。可先在地址表建立并确认符号,再运行:
local addr = getAddressSafe("MyPracticeSymbol")
if addr == nil then
print("符号不存在,请先确认进程与符号")
return
end
print(string.format("地址: %X", addr))
示例符号是占位名称,需替换成自己已验证的地址表达式;不要把示例当作默认存在的符号。
按类型读取
readInteger(addr) 读取四字节整数,readFloat(addr) 与 readDouble(addr) 分别读取单精度和双精度浮点。readPointer(addr) 根据目标位数读取指针,readBytes(addr, 4, true) 返回字节表。先用地址表确认类型和数值,再读;读取失败可能返回 nil 或引发错误,使用 pcall 包围不确定的访问,并检查返回值。
验证与写入边界
先只读并与 Tutorial 当前显示值比较;操作 Tutorial 按钮后重新读取,确认变化方向。确需对自己的练习程序写入时,记录原值、确认类型与地址,检查 writeInteger(addr, value) 的返回值,随后读回;如果进程退出或地址已迁移则停止,不能继续使用旧地址。
读取已确认的四字节数值
先在 CE 界面附加自己的练习进程,并用扫描确定地址。把下列示例中的十六进制字符串替换为当前运行的真实地址;不要带 0x 前缀。先确认这是一个四字节整数,再执行:
local addr = tonumber("12345678", 16) -- 替换成已验证地址
local ok, value = pcall(readInteger, addr)
if not ok or value == nil then
print("读取失败,请确认进程、地址和类型")
else
print("当前整数: " .. tostring(value))
end
操作练习程序的按钮后再运行一次,输出应与界面数值一致。如果不一致,停止并重新确认类型和候选地址。进程重启后须重新寻找地址。
进一步验证
例如练习窗口显示整数一百,先通过界面扫描并确认记录随按钮变化;随后在同一次运行中将地址表达式用于只读脚本。如果脚本返回空值,不应立即尝试写入,而要检查进程是否仍运行、表达式是否能解析、读取函数是否与数据类型相符。练习结束后关掉用于轮询的资源,重新启动程序并重复确认流程,观察旧地址是否仍然有效。
如果使用模块表达式,确认模块确实属于当前进程,并在目标重新启动后再次解析。只读结果与界面一致后,还应通过改变目标值再次核验。