跳到主要内容

WSL2 利用 inotify 对 OneDrive 进行实时同步

· 阅读需 6 分钟
Muel - Nova
Anime Would PWN This WORLD into 2D

最近在做一些开发相关的项目,我项目全放在 OneDrive 上,利用 ln -s 做了一个软链接在 WSL2 上进行开发。

WSL2 ext4 和 NTFS 这类跨文件系统的 IO 实在是太慢了,一些 venv, node_modules 也会严重的污染我的 OneDrive,尽管针对这些做了一定的优化,最近高频次的使用 git status 等也让我对于这个方案有了一些嫌弃,不过一直都觉得 OneDrive 同步带来的 benefits 远大于这些 side effects,所以一直没管,昨天看到了 Dev Drive,突然就想着不然改一下吧。

考虑到项目一般具有文件数量大,且绝大部分为小文件的特点,我决定将一些特定的文件夹迁移到 wsl2 中,利用 Robocopy,将 OneDrive 与 WSL2 中的内容进行双向同步,通过空间来换效率。

这篇文章将针对我的使用情况进行个性化定制,如果你只是需要备份 WSL2 的东西到 OneDrive,推荐参考 这篇文章

「Kernel」Linux kernel lab 浅浅跟随

· 阅读需 93 分钟
Muel - Nova
Anime Would PWN This WORLD into 2D

在此之前

在这篇文章中,我们将跟随 Linux Kernel Teaching,进行由浅入深的内核学习,以适应未来(可能出现的)内核开发工作。

值得注意的是,这个课程也拥有 中文版本,你可以在 linux-kernel-labs-zh/docs-linux-kernel-labs-zh-cn 进行 star 以支持他们的工作。

在接下来的博客中,我可能仅对 课程 部分进行简述,重复抄写已有内容而不加自己的思考总是没有意义的。我们的重点将放在 实验 部分。

机械革命翼龙 15Pro 迁移 Linux 遇到的一些问题

· 阅读需 6 分钟
Muel - Nova
Anime Would PWN This WORLD into 2D

买了高性价比非大众电脑带来的后果,就是完全没有对 linux 等做过硬件上的适配(也不准备支持)。用了一周解决了大概三个问题:内置键盘失灵、蓝牙模块无效、显卡驱动装不上、休眠立马唤醒的问题,简单记录一下。

2024 保研夏令营机试刷题记录

· 阅读需 137 分钟
Muel - Nova
Anime Would PWN This WORLD into 2D

刷 leetcode 还是没什么意思,准备一天来一套真题(笑,不做特别难的题和特别麻烦的大模拟,确保做题速度。

会按照一个顺序选择刷题。

Wayland - 腾讯会议屏幕共享解决方案

· 阅读需 17 分钟
Muel - Nova
Anime Would PWN This WORLD into 2D

组会的时候尝试投屏却只能看到我的鼠标指针,最后演变为使用健硕手机拍屏方案,好不雅观。经过一翻搜索找到一个比较优雅(Yet 扭曲)的解决方案,因此简单记录一下。

小米手环 8 Pro 自动上传数据到 Obsidian 的思路

· 阅读需 21 分钟
Muel - Nova
Anime Would PWN This WORLD into 2D

前几天学着 DIYGOD 搞了一套生活管理系统。在各种插件的加持下算是做到了半自动化,然而,睡眠时间和步数,以及可能的心率血压等数据仍然需要手动记录手动填写实在是不算 Geek。搜索之后得知其实 Zepp(原 Huami) 存在有逆向后的 API 接口且明文存储步数等信息,于是便脑子一热入了 小米手环 8 Pro 原神联名版。拿到手后,才惊讶地发现 小米手环 8 已经不再支持 Zepp,小米手环 7 虽然表面上不支持,但也能使用修改 QRCode 和 Zepp 安装包的方式,然而小米手环 8 已经是彻底把 Zepp 给 Deprecated 了。

幻兽帕鲁如何将本地存档修改为服务器存档

· 阅读需 4 分钟
Muel - Nova
Anime Would PWN This WORLD into 2D

阅读之前

请确保你拥有一定的动手能力。基于已经能够开启服务器的思考,下文将默认读者会使用 Python3,会使用 terminal。

前置条件

%SAVE%
├── LevelMeta.sav
├── Level.sav
├── LocalData.sav
├── Players
│   ├── 00000000000000000000000000000001.sav
│   ├── PLAYER_B_GUID.sav
│   └── PLAYER_C_GUID.sav
└── WorldOption.sav

版本信息(时效性)

修改过程

服务器存档提取

首先确保你的服务器已经开启完成,将 %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 文件

image-20240122100541443

uesave to-json --input <GUID>.sav.gvas --output <GUID>.sav.json

「PWN」CVE-2023-4911 复现

· 阅读需 28 分钟
Muel - Nova
Anime Would PWN This WORLD into 2D

最近接触到了这个洞,感觉利用面还是挺广的,虽然国内绝大多数机子似乎 libc 版本都挺低的(),总而言之先调调看看吧。

环境搭建

测试环境

OS: Ubuntu 22.04.1 LTS on Windows 10 x86_64

Kernel: 5.15.123.1-microsoft-standard-WSL2

Glibc: 2.35-0ubuntu3.3