在 MuMu 模拟器中使用 objection 获取米游社的 DS salt 实战

背景
最近心血来潮自己搓了个Astrbot米游社签到插件,根据前人的经验,米游社的接口请求需要携带 x-rpc-ds(DS)签名头。DS 的计算方式(MD5(salt + 时间戳 + 请求体) 一类)早已被 lulu666lulu 等大佬公开,算法本身不是问题;那么要维护这么一个插件最重要的就是这个唯一会变的 salt——它随客户端版本更新而更换,且明文存在于 App 进程的内存中。
所以思路很简单:
- 用 frida / objection 注入米游社进程
- 在内存里搜关键字
salt= - 把命中地址附近的 64 字节 dump 出来
- 直接读出 salt
环境准备
| 项目 | 说明 |
|---|---|
| 电脑 | Windows,装有 Python 3 (推荐3.8及以上)与 pip |
| objection | pip install objection(会顺带安装 frida 依赖) |
| 模拟器 | MuMu 模拟器(x86_64 架构,自带 root),开启 adb 调试 |
| App | 米游社(包名 com.mihoyo.hyperion),先在模拟器中装好并登录 |
| 其它 | adb、WinHEX(可选,用于查看内存 dump 文件) |
⚠️ 重点:MuMu 模拟器是 x86_64 架构,frida-server 必须下载
android-x86_64版本,不要下成 arm64!
多开与设备识别
MuMu 支持多开,每个实例对应一个 adb 设备。打开多开管理器启动需要的实例:

用 adb 查看当前设备列表:
adb devices多开时会看到多个设备,例如:
List of devices attachedemulator-5554 deviceemulator-5558 device本文以 emulator-5558 为例。下面所有命令都通过 -s emulator-5558 指定设备,避免多实例互相干扰。
补充:更多 MuMu adb 调试相关信息见以下链接
站外引用 · 引用站外地址,不保证站点的可用性和安全性MuMu模拟器如何连接 adb?_MuMu模拟器_安卓模拟器点击MuMu模拟器菜单-设备诊断,打开问题诊断界面后,下滑界面即可看到 ADB 端口号
安装并启动 frida-server
4.1 下载对应架构的 frida-server
到 frida releases 页面 下载 与你电脑端 frida 版本一致 的 server:
- 文件名:
frida-server-17.17.0-android-x86_64.xz - 解压后得到可执行文件
frida-server-17.17.0-android-x86_64
电脑端版本可用 frida --version 查看,两者必须一致,否则会连接失败。
4.2 推送到模拟器
adb -s emulator-5558 push frida-server-17.17.0-android-x86_64 /data/local/tmp/frida-server4.3 启动 frida-server
adb -s emulator-5558 shell进入 shell 后执行(MuMu 默认已 root,若提示权限不足先执行 su):
sucd /data/local/tmpchmod 755 frida-server./frida-server这个终端要保持开着,frida-server 不能退出。
4.4 端口转发(另开一个终端)
adb -s emulator-5558 forward tcp:27042 tcp:27042adb -s emulator-5558 forward tcp:27043 tcp:27043小坑:code.md 里写的
adb -s 5558 forward ...少了emulator-前缀,设备序列号是emulator-5558,漏了会报error: device '5558' not found。
4.5 验证是否成功
frida-ps -U能输出进程列表即成功(多开场景可加 -D 指定设备:frida-ps -D emulator-5558)。
Objection 注入
先在模拟器中打开米游社并登录,保证进程存在。确认进程:
frida-ps -U
能看到对应进程即可。然后执行 objection:
objection -n com.mihoyo.hyperion start-n:按进程名(即包名)附加到正在运行的 Appstart:打开 objection 交互式 REPL(老版本叫explore,已废弃)
注入成功后提示符会变成 ...,表示已进入 objection 的 REPL。
搜内存
在 REPL 中先触发一次带 DS 的请求:切到米游社首页,确保 App 发过签名请求、salt 已进入内存。
然后搜索关键字:
memory search "salt=" --string --offsets-only输出示例:
# Searching for: 73 61 6c 74 3d# Pattern matched at 3 addresses# 0x13cf7750# 0x7c46b1880fe3# 0x7c471c392c30
参数说明:
--string:把引号里的字符串salt=转成十六进制(73 61 6c 74 3d)再搜,等价于直接搜 ASCII 文本--offsets-only:只列出命中的内存地址,不附带内容
命中多个地址是正常的(salt 被多次加载/引用),一般取第一个即可。
dump 内存
依次导出得到的地址,dump 其后的 64 字节(足够容纳 salt= + 32 位盐):
memory dump from_base 0x7060361818 64 ./dump_memory输出示例:
# Dumping 64.0 B from 0x7060361818 to ./dump_memory# Memory dumped to file: ./dump_memory
dump 文件会生成在电脑上(objection 运行目录),内容是二进制。直接用 WinHEX 打开,在右侧 ASCII 区就能看到 salt= 开头的字符串:

拿到结果,形如:
salt=SVHcDPuPJYhcm57aSLDe7IwI5gvjgAib= 后面的 32 位字符串就是当前版本米游社的 DS salt。
如果没有 WinHEX,直接在 objection 的 shell 里
cat dump_memory也能看到,只是可能带点乱码。
验证
用拿到的 salt 按公开的 DS 算法拼接签名(salt + 时间戳 + 请求体 → MD5),请求一个需要签名的米游社接口,返回正常数据即说明 salt 正确;也可以和抓包工具里同一次请求的 x-rpc-ds 比对确认。
常见问题
| 问题 | 原因 / 解决办法 |
|---|---|
frida-ps -U 报版本不匹配或连不上 | frida-server 与电脑端 frida 版本不一致,pip install frida==<server版本> 对齐,或换对应版本的 server |
error: device '5558' not found | 序列号写错,应为 emulator-5558;先 adb devices 确认 |
| 注入的是另一个模拟器实例 | 多开场景给 objection 加 -S emulator-5558 指定设备 |
搜不到 salt= | 先在 App 里触发一次带 DS 的请求(刷新动态 / 进入「我的」)再搜 |
| 命中多个地址,dump 出来内容不对 | 多个地址都 dump 一遍,挑包含 salt= 文本的那个 |
| 注入后 App 闪退 | 部分版本有 root / frida 检测,可尝试旧版本 App、给 frida-server 改名后重启,或改用 spawn 方式注入 |
| salt 失效 | salt 随 App 版本更新变化,每次版本更新后按本文流程重新提取即可 |
写在最后
- 内存地址是运行时地址(ASLR),每次启动进程都会变,所以每次提取都要重新搜一遍。
- 整个过程基于 objection 的
memory search/memory dump两个命令,原理就是:salt 以salt=<值>的键值对明文躺在内存里,找到关键字就能挖出来。 - 本方法仅用于学习交流,请勿用于非法用途。
参考资料
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!












