组会的时候尝试投屏 却只能看到我的鼠标指针,最后演变为使用健硕手机拍屏方案,好不雅观。经过一翻搜索找到一个比较优雅(Yet 扭曲)的解决方案,因此简单记录一下。
将 arch-linux 安装到 USB 移动硬盘并且保留存储空间给 Windows 设备使用
苦于多端环境同步多年,突然想到 我仍然有一个 SanDisk 256G Gen3.1 的 U 盘可以使用,因此研究一下如何将 arch linux 安装在 U 盘上
前置准备:
- VMWare Workstation
- Arch Linux 镜像
- 一个快速的大容量 U 盘(推荐 USB 3.0+,并且大小在 50GB 以上)
小米手环 8 Pro 自动上传数据到 Obsidian 的思路
前几天学着 DIYGOD 搞了一套生活管理系统。在各种插件的加持下算是做到了半自动化,然而,睡眠时间和步数,以及可能的心率血压等数据仍然需要手动记录手动填写实在是不算 Geek。搜索之后得知其实 Zepp(原 Huami) 存在有逆向后的 API 接口且明文存储步数等信息,于是便脑子一热入了 小米手环 8 Pro 原神联名版。拿到手后,才惊讶地发现 小米手环 8 已经不再支持 Zepp,小米手环 7 虽然表面上不支持,但也能使用修改 QRCode 和 Zepp 安装包的方式,然而小米手环 8 已经是彻底把 Zepp 给 Deprecated 了。
幻兽帕鲁如何将本地存档修改为服务器存档
阅读之前
请确保你拥有一定的动手能力。基于已经能够开启服务器的思考,下文将默认读者会使用 Python3,会使用 terminal。
前置条件
- Python3
- MuelNova/Palworld-Save-Patcher
- 准备转换的存档,下文将直接使用 %SAVE% 来指代这个目录,它 应该类似于如下
%SAVE%
├── LevelMeta.sav
├── Level.sav
├── LocalData.sav
├── Players
│ ├── 00000000000000000000000000000001.sav
│ ├── PLAYER_B_GUID.sav
│ └── PLAYER_C_GUID.sav
└── WorldOption.sav
版本信息(时效性)
- Palworld v0.1.2.0
- 服务器部署使用 https://github.com/thijsvanloef/palworld-server-docker
修改过程
服务器存档提取
首先确保你的服务器已经开启完成,将 %SAVE% 完整的复制到服务器存档处。
原房主登入游戏,应该存在需要新建用户的情况,此时新建用户,随意进行一些操作后退出。
此时,应该在 %SAVE%/Players
文件夹下多出一个新的文件,这个 GUID 是每个 STEAM 用户特定的,我们用 0D000721000000000000000000000001.sav
表示
%SAVE%
├── LevelMeta.sav
├── Level.sav
├── LocalData.sav
├── Players
│ ├── 00000000000000000000000000000001.sav
│ ├── PLAYER_B_GUID.sav
│ ├── 0D000721000000000000000000000001.sav
│ └── PLAYER_C_GUID.sav
└── WorldOption.sav
此时,0d000721000000000000000000000001 即为原房主的 GUID
关闭服务器,确保你已经对 %SAVE% 文件夹进行了备份
脚本运行
git clone https://github.com/MuelNova/Palworld-Save-Patcher.git
cd Palworld-Save-Patcher
python script.py fix-host %SAVE% %GUID%
# 请自己替换
# python script.py fix-host /home/nova/test_pal 0d000721000000000000000000000000
重新开启服务器
此时原房主进来应该已经有东西了,但是名称和工会 不再存在。需要加入好友的服务器才可以。这也是一个小缺陷(因为这些内容存在 BYTE 里,使用 uesave 不太方便弄)
原理
这部分不感兴趣的人可以不看了
存档文件分析
在 %applocaldadta%\Pal\Saved\SavedGame\<STEAM_ID>\<WORLD_ID>
下
LocalData.sav
保存了地图,与用户无关。可以直接拷贝去其他存档省去开图的过程。
Level.sav
关键文件,保存了所有的资源及其所有者以及地图事件等信息
Player/xxxxxx.sav
玩家文件
.sav 文件
目前还只知道修改方法,而不知道原理,可以看 Converting PalWorld saves to JSON and back (github.com) 这个 gist。
首先对于一个 .sav
文件,它并不是一个标准的 UE .sav 文件头,而是一个经过 zlib
压缩(或者二次压缩)的文件。
[0:4]
为未压缩大小
[4:8]
为压缩后大小
[8:11]
为一个固定的 magicNumber "PlZ"
[11]
为一个 type,可能为以下值: 0x30, 0x31, 0x32
。其中 0x30
还没有使用。而 0x31
为一次 zlib 压缩,0x32
为两次 zlib 压缩
[12:]
即为压缩后的数据
解压缩后即为一个 GVAS 文件,可以直接使用 trumank/uesave-rs: Rust library to read and write Unreal Engine save files (github.com) 等来转换为 json 文件
uesave to-json --input <GUID>.sav.gvas --output <GUID>.sav.json
「PWN」CVE-2023-4911 复现
记录一些我现在使用的好用小玩具
用电脑这么多年,也收集了不少提升易用性、提高效率的软件(并且收获了一个囊肿的任务栏)。趁这个机会分享一下,不定期更新
是的,我更换了昵称!
思考了许久这篇 blog 应该放在 小丑 专栏还是 blog 专栏,还是最后决定把一些生活中的小事(或者说不是那么有趣的)分享在这里。