jshook 中文文档 下载 App

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 极简单、自动处理类型、自动持久化。缺点是不适合存大量数据。