storage 本地存储——键值对数据持久化
基本用法
// 存
storage.set('max_gold', 99999);
// 取
var gold = storage.get('max_gold');
console.log('[+] 记录的金币上限: ' + gold);
// 删
storage.remove('max_gold');
// 清空所有
storage.clear();
数据类型
storage.set 和 storage.get 自动处理类型:
storage.set('name', 'test'); // 字符串
storage.set('count', 100); // 数字
storage.set('enabled', true); // 布尔值
storage.set('list', [1, 2, 3]); // 数组
storage.set('config', { key: 'val' }); // 对象
console.log(typeof storage.get('name')); // string
console.log(typeof storage.get('count')); // number
console.log(typeof storage.get('enabled')); // boolean
默认值
storage.get 可以传默认值,key 不存在时返回默认值:
var lastTime = storage.get('last_run_time', 0);
if (lastTime === 0) {
console.log('[+] 第一次运行');
} else {
console.log('[+] 上次运行: ' + lastTime);
}
典型场景
记住用户设置
脚本里做了一个开关,下次打开目标应用时还要记住上次的状态:
// 初始化
var goldEnabled = storage.get('gold_switch', false);
// 创建 Mod Menu
var menu = modmenu.create('设置', [
{ type: 'switch', title: '金币翻倍', val: goldEnabled, id: 'gold' }
], {
onchange: function (result) {
if (result.id === 'gold') {
storage.set('gold_switch', result.val);
console.log('[+] 设置已保存: gold = ' + result.val);
}
}
});
跨运行会话传递数据
Hook 里拿到了某个值,下次脚本运行(比如目标应用重启后)还要接着用:
// 第一次运行时记录 base 地址
var il2cpp = Module.findBaseAddress('libil2cpp.so');
storage.set('last_il2cpp_base', il2cpp.toString());
// 下次启动时读取
var savedBase = storage.get('last_il2cpp_base', '');
console.log('[+] 上次的 base: ' + savedBase);
版本迁移
脚本升级时需要处理旧数据格式:
var savedVersion = storage.get('saved_version', '0');
var currentVersion = '1.1.0';
if (savedVersion === '0') {
// 首次运行,初始化默认配置
storage.set('saved_version', currentVersion);
storage.set('max_gold', 99999);
} else if (savedVersion === '1.0.0') {
// 从 1.0.0 升级到 1.1.0,需要迁移
var oldGold = storage.get('gold_limit', 0);
storage.set('max_gold', oldGold);
storage.remove('gold_limit');
storage.set('saved_version', currentVersion);
}
和 file / storage 的选择
| 需求 | 用哪个 |
|---|---|
| 存小量配置数据(几十条 key) | storage |
| 存大量数据(列表、日志等) | file |
| 需要跨会话持久化 | storage(简单)或 file(灵活) |
| 目标应用数据 | file(直接读写沙箱) |
storage 的优势是 API 极简单、自动处理类型、自动持久化。缺点是不适合存大量数据。