十一七 发表于 2024-8-5 15:28

超星阅读器之电子书PDZ&PDG逆向杂记

关于 PDZ,也许大部分都不知道这是什么东西。摘抄一下第三方的介绍:

> PDZ格式是一种电子书文件格式,主要用于超星阅读器(由超星公司推出的一款电子书阅读及下载管理的客户端软件)中的电子书资源。这种格式的特点是能够提供较好的版权保护,并且通常包含了丰富的电子书阅读功能,如书签、标记、资源采集、文字识别等。

简而言之,PDZ&PDG文件都是超星自家构建的一个文件格式。

TL;DR
- PDG 可以视作电子书的单页,包含诸如图像数据的信息
- PDZ 可以视作多个 PDG 文件的集合、额外的,其包含了图书信息,证书信息

当然,有关 PDZ & PDG 文件格式本身,我们对其知之甚少。互联网上与之相关的内容大多涉及话题:PDZ/PDG转PDF,而在此话题下,能够阅览到的仅仅是通过各种依赖原客户端本身对其进行截图,合成PDF的操作。这意味着 PDZ 对我们来说仍是一个黑盒。

通过逆向工程,我们可以了解到 PDZ 文件的一些基本信息。

其拥有一个固定大小的文件头部: **PDZHdr**

此结构包含了一些基本信息,包括:
- 文件标识符
- 文件类型
- 版本信息
- 打包所使用的加密算法
- 电子书的类型
- 元数据的位置
- 元数据的大小
- CRC 校验
- etc.

这里通过表格列举出部分关键字段,对于暂不知其用途的字段统一标为 `unknown`

| Offset | Size | Name          | Desc               | value                                             |
| ------ | ---- | ------------- | ------------------ | ------------------------------------------------- |
| 0      | 4    | magic         | magic value      | 0x67647025                                        |
| 0x4    | 4    | type          |                  | 0x0000007A / 0x0000787A / 0x0000667A / 0x00006D7A |
| 0x8    | 4    | version       | PDZ format version | "1.01"                                          |
| 0xC    | 1    | unknown       |                  |                                                   |
| 0xD    | 1    | cipherType    | packet algo      | 1 = tea<br>2 = des<br>3 = unknown<br>4 = blowfish |
| 0xE    | 1    | unknown       |                  |                                                   |
| 0xF    | 1    | bookType      |                  | enum 1 / 2 / 3 / 4 / 5                            |
| 0x10   | 4    | contentSize   | content size       |                                                   |
| 0x14   | 4    | catalogOffset | catalog offset   |                                                   |
| 0x18   | 4    | catalogSize   | catalog size       |                                                   |
| 0x1C   | 0x20 | marker      | packet marker      |                                                   |
| 0x3C   | 0x4| checksum      | crc32            |                                                   |
| 0x40   | 0x20 | reserved      | reserved field   |                                                   |

显而易见,我们需要通过 catalog 去列出文件的目录,而 `catalogOffset` 处对应的数据段为加密段,其使用固定算法 tea,固定密钥进行加密。

这并不难,解密后,我们可以可以看到形似下图的内容。



不妨猜一猜其包含了哪些内容。

其包含了基本的文件名、文件偏移、文件大小。

通过表格列出其结构

| Offset | Size | Name   |
| ------ | ---- | -------- |
| 0      | 0xC| filename |
| 0xC    | 0x4| offset   |
| 0x10   | 0x4| size   |

此时我们通过此类结构字段,定位到对应文件位置,确定文件大小。但同时发现,其数据仍然为加密段。此时将用到 PDZHdr 中的 cipherType 字段,根据此字段指定算法进行解密。但需要注意的是,为了解密,我们需要得到 key。溯源 key 后可以发现其来自于位于文件末尾的证书段。

证书段内容为明文段,以下是一段示例:
```
SSCT9770740AE18486AB8415F2F1605C71F78C2EA79C82B8853FA74D02EA14AA2E4003E22AF282A42B45F4365A4CA4D7CB3EEAA87863C29AEF4847B09628981D7489341668FD45F5E2E0437B337582E2E7422F571518A44C20C12D960460A0E122CF0D3A315481B8A7D2303438D406C44606925E120D3EFECFC3201B0166BF35ED128D464CD114938AA1138D236D83545231AFA8A4570F6D049D44F135D3144EB58924D1B9A5980890BC21B85321BD5303F2BC803FBED9CEBB10F9E26DEBB10C642315213DA4CAFEA41C25A46813CF89F581E1FF7411A91F1F3F0441E14A0C514328BB2FBDF5F631CBC1B82291954439B976BAEADCA5EA51C156AE8C7F8190632AC38005BC385A33A1CD3B7F1C7A9BEA86C5B83F1AC6BACC0220844229C5DC6CC114FCBEC353FE8FAE6F52E3EE521296C4291A7E360D91E7FE2451950AA67F9C59EE2F7DA3C7B1567B0A022BFC780A435AD34EC3650F625386EA0263F858E20DBD004FE2E9B69E02E16F6F48CE9B0FF7318990139F214AC7ECE148A4CAFE8CCE39FA37CE240BF32477A2B01401892C16011FBCC57407CD3ADF0AFD04A11730A49F4BF80017FE9548F3EE2235A407AC29261BB89DSSCE
```

其可被解析为多个子段,客户端据此验证并限制使用者身份、电子书有效期等相关手段。下面是一段解密后示例

```xml
<?xml version="1.0" encoding="UTF-8"?>
<cert>
        <certexpdate>2073-11-09</certexpdate>
        <userinfo>
                <username>{*}</username>
                <useraccount></useraccount>
                <password></password>
                <userexpdate>0</userexpdate>
        </userinfo>
        <rightinfo>
                <bookkey>****L9Z5</bookkey>
                <print canprint="" printlimit="" printrange=""/>
                <copy cancopy="" copylimit="" copyrange=""/>
        </rightinfo>
        <auth>****660CB9AF2A03CD26AB1CD******2</auth>
        <reserve></reserve>
</cert>
```

这里出现的 `bookkey` 或 `key` 即解密 PDG 文件的 key。

当然,所有上述 key 并非直接使用,而是通过对应字母表映射后,得到一串长度为 32 的十六进制明文串后进行 MD5,最终得到 16 字节的 key。


PS: 出于研究目的,暂时揭露上述部分。

最后放一张使用 010 Editor 进行解析的图。



我是不会改名的 发表于 2024-8-5 18:43

太强了,以前看过,种类太多了就放弃了。
pdz也分好几种,有纯图的,有pdf的。
Pdg也分单页和多页,pdf的一般是一章一个。还有epub的,杂七麻八的一大堆
后面发现c盘会缓存解密后的图片/pdf/epub就没研究过过了

Timoney 发表于 2024-8-19 00:16

有些超星的pdz可以直接下载,然后用超星的阅读器阅览。但是一旦换了台电脑,pdz就提示什么”证书长度为0“,就看不了了,这个应该就是对应楼主写的这些了

zlzx01 发表于 2024-8-5 15:34

期待后续作品,有大量的PDG文件需要解密打开。

wasm2023 发表于 2024-8-5 16:05

感谢分享,收藏学习了

ZHOUHAHA1 发表于 2024-8-5 16:20

大佬你好

wpdzdx 发表于 2024-8-5 16:28

所以应该怎么打开呢

Yang3 发表于 2024-8-5 16:36

大佬牛哇 找这个好久了

Yang02024 发表于 2024-8-5 16:53

看了看,表示没看懂

vstardust 发表于 2024-8-5 17:18

没看不懂啊

deniol 发表于 2024-8-5 17:21

Yang02024 发表于 2024-8-5 16:53
看了看,表示没看懂

看了又看,还是没看懂!{:1_937:}

PastorBonus 发表于 2024-8-5 17:29

好厉害,学一下
页: [1] 2 3 4 5 6 7
查看完整版本: 超星阅读器之电子书PDZ&PDG逆向杂记