如何用Lua实现字符串随机或按名称列表循环变更?
实现字符串的随机/列表驱动式内存替换
针对你的需求,我们可以从两种场景修改原脚本:从指定列表中随机选取替换字符串,或是生成完全随机的字符串,以下是具体实现:
一、基于指定名称列表随机变更
先定义一个包含所有候选字符串的列表,每次替换时随机从中选取一项:
-- 初始化随机数种子(确保每次运行随机结果不同) math.randomseed(os.time()) -- 定义要替换的目标字符串列表 local string_to_find = 'o(*_*)o' local replacement_list = { '^1o(*_*)o', '^2(^_^)', '^3(*^_^*)', '^4o_O', '^5(-_-;)' } ms = createMemScan() ms.firstScan(soExactValue, vtString, 0, string_to_find, "" , 0, 0xffffffffffffffff, "", fsmNotAligned, "1", false, false, false, false) ms.waitTillDone() f=createFoundList(ms); f.initialize(); for i = 0, f.Count - 1 do -- 从列表中随机选取一个替换字符串 local random_str = replacement_list[math.random(#replacement_list)] writeString(f.Address[i], random_str) -- 保留原脚本的终止符写入逻辑 writeBytes(("0x" .. f.Address[i]) + 4, 0) end f.destroy() ms.destroy()
关键修改点:
- 添加
math.randomseed(os.time())初始化随机数生成器,避免每次随机结果重复 - 用
replacement_list存储所有可选的替换字符串 - 在循环中通过
math.random(#replacement_list)随机获取列表索引,选取对应字符串
二、生成完全随机的字符串
如果需要无规则的随机字符串,可以编写一个随机字符串生成函数,自定义字符集和长度:
math.randomseed(os.time()) local string_to_find = 'o(*_*)o' -- 生成随机字符串的函数:指定长度和可选字符集 function generateRandomString(length, char_set) -- 默认字符集:包含字母、数字和常用表情符号 char_set = char_set or 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789(*_^)o_O^~' local result = '' for _ = 1, length do -- 随机选取字符集中的一个字符 local rand_index = math.random(#char_set) result = result .. char_set:sub(rand_index, rand_index) end return result end ms = createMemScan() ms.firstScan(soExactValue, vtString, 0, string_to_find, "" , 0, 0xffffffffffffffff, "", fsmNotAligned, "1", false, false, false, false) ms.waitTillDone() f=createFoundList(ms); f.initialize(); for i = 0, f.Count - 1 do -- 生成长度为8的随机字符串(可自定义长度) local random_str = generateRandomString(8) writeString(f.Address[i], random_str) writeBytes(("0x" .. f.Address[i]) + 4, 0) end f.destroy() ms.destroy()
关键修改点:
- 新增
generateRandomString函数,支持自定义字符集和字符串长度 - 循环中调用函数生成随机字符串,替换固定的目标字符串
注意事项
- 如果是在Cheat Engine中运行脚本,确保
math.randomseed的初始化逻辑正常(部分环境可能需要额外处理随机种子) - 原脚本中的
writeBytes(("0x" .. f.Address[i]) + 4, 0)是针对特定内存结构的终止符写入,若你的目标字符串长度变化,可能需要调整偏移量+4的数值,避免破坏内存结构
内容的提问来源于stack exchange,提问作者Manuel Castro
相关产品推荐
相关产品推荐

