From 3ca325ffe4b0d11e0884eedb7e4863e06d255df1 Mon Sep 17 00:00:00 2001 From: jixunmoe Date: Fri, 31 Mar 2023 14:49:10 +0000 Subject: [PATCH] Update 'Kuwo' --- Kuwo.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Kuwo.md b/Kuwo.md index b6bed36..2796ba6 100644 --- a/Kuwo.md +++ b/Kuwo.md @@ -31,7 +31,7 @@ 内部名称为 `KwPocoVersion` 或 `EncryptVersion`。 (内部) 加密版本为 `3` 时,当作未加密文件处理。猜测下个加密版本可能会使用 `4`。 - `0x18`: `u32,le` 资源 ID,同之前版本。写出时实际写出的是 `u64` 数值。 -- `0x30`: `char[?]` 缓冲区,读入字符到一个类型为 `std::string` 的变量内。 +- `0x30`: `char[?]` 文件格式,读入字符到一个类型为 `std::string` 的变量内。 在该样本的情况会读入 `11` 字节并储存。 - `0x68`: `u8` VIP 资源类型,见下表; @@ -68,3 +68,15 @@ 1. 读取文件头,校验加密版本是否为 `2`。 2. 使用读入的 `ekey` 进行解密,解密时的 `offset` 为 `file_offset - 1024`。 3. 使用 QQ 音乐同款 `QMC2::MAP` 或 `QMC2::RC4` 进行解密 (取决于密钥长度)。 + +### ekey 缓存 + +该逻辑在安卓的 Java 端: + +```java + public static String get_cached_file_ekey(long res_id, String format) { + return MMKV.ReadMMKVString("sec_ekey", res_id + "-" + format.toLowerCase(), ""); + } +``` + +其中 `format` 为文件格式,该样本的值为 `"20900kmflac"`;`res_id` 则是资源 ID,为 `226743561`。