我是不会改名的 发表于 2022-8-11 22:52

在线阅读文档解密

本帖最后由 我是不会改名的 于 2022-11-14 12:10 编辑

# 在线阅读文档解密

# 前言

承接上篇[在线阅读epub解密](https://www.52pojie.cn/thread-1634927-1-1.html),这次讲讲一些常见在线阅读文档解密。

# 正文
图片全挂了有需要下载
https://nicaicai.lanzouv.com/i2n3E0fw3ovg

## pdf文件头

```
%PDF-1.
base64:JVBERi0x
hex:25 50 44 46 2D 31
bytes:{37,80,68,70,45,49}
这个很重要,至少要记住前两行,方便快速识别文件
```

## 一、pdf格式

### 第一种,Range

![](http://pic.rmb.bdstatic.com/bjh/71851539ca0cdd79d8fd76e426a86630.png)

请求头中有个明显的参数Range: bytes=0-0,看网页中不断请求同一个地址

![](http://pic.rmb.bdstatic.com/bjh/44d01406723d4c31e497b0930308a1ee.png)

每次请求的Range:范围都不一样,说明就是分段请求的,通常只需要把请求头中bytes=0-?,改成bytes=0-,就可以得到整个pdf,最简单的办法就是用fiddler抓包,重发

![](https://img01-xusong.91q.com/DD950369-5254-4E5B-9DDF-AD8921594B7A.png)
![](https://img01-xusong.91q.com/5A042D62-F080-49B6-AD7B-015B62B26421.png)

这种应该是最简单的了,但可能会有坑,我碰到过一个,如果直接按bytes=0-,会保错,后来发现,直接翻到最后一页,请求头中的范围,比响应头返回的要小十个字节左右,所以还是要根据实际情况仔细甄别。

### 第二种,base64

![](https://img01-xusong.91q.com/ABCB9593-6D02-4315-A69A-E180CC708283.png)

很明显就是base64编码了,网页解码后很多时候再生成一个blob,pdf。

这个只需要解下码在写入文件就行,或者有blob直接下载就行。

这种也有坑的,有可能pdf会有密码,也有可能在生成blob时加上了密码。

### 第三种,AES或其他

aHR0cDovL3d3dy5qdHlzYnouY246ODAwOS9wZGYvdmlld2VyLzA5NDY0MjcyNWJmOWE=

![](https://img01-xusong.91q.com/5CC00BFB-DDAB-4643-9E7B-013FF87823CA.png)

最大特征就是啥也看不懂,只有分析js。

以这个网站为例简单分析一下,先下一个XHR断点(也可以根据堆栈分析),

![](https://img01-xusong.91q.com/96AF3842-69D3-45AB-8D39-CA5F70A548D9.png)

F5刷新,看堆栈,看看附近的代码

![](https://img01-xusong.91q.com/F5720B7E-E875-4BEC-9F94-48EC012D2955.png)

发现一个可疑的的地方,查看函数调用,直接搜索,或者下断点刷新,再看堆栈

![](https://img01-xusong.91q.com/A3F51388-D3BE-4734-AAA2-84BDB06CAE95.png)

没什么好说的了,人家注释都标上了,就是一个AES

![](https://img01-xusong.91q.com/0A8506E9-C9DE-4D34-8829-28358F00966A.png)

第四种,请求头加密

浏览器返回的数据,并没有加密,但无论是直接打开还是用curl-py,都不行,说明请求地址很可能是一次性的

![](https://img01-xusong.91q.com/0303084C-3B0F-4D87-ACD8-8B192F8EF15F.png)

先验证下,右键阻止请求域,翻一页。链接生成了,并没有发送出去,用py跑两次。

![](https://img01-xusong.91q.com/5C1CE95F-D15A-40AB-93A9-D2BE5BCD6F33.png)

可以看到第一次请求成功,第二次失败了,说明就是一次性的

![](https://img01-xusong.91q.com/7A147509-43C7-440E-A289-86D601A2F63E.png)

而且这个pdf是分页的,不可能手动下载,看下参数,同一本书,四个不一样,页数,时间戳,签名,还有个应该是随机生成的,直接用uuid.uuid4()就行了,

![](https://img01-xusong.91q.com/657C9CE8-1F10-4C85-BA11-6C54FF03CB04.png)

直接搜索关键词**nonce**,下个断点刷新,看堆栈,找到加密的位置。

![](https://img01-xusong.91q.com/08A1F99A-B412-4F84-879F-C5BD34843C7B.png)

可以看到这个UUID,就是uuid4,py里面直接

```
import uuid
uuid=uuid.uuid4()
```

然后是这个sign,先控制台运行几遍,同时查看各参数值

![](https://img01-xusong.91q.com/CDE26BC1-B0F8-41EF-AC3D-8DFABB50995F.png)

发现每次,签名结果都一样,而且都是32位,很大可能就是MD5,随便找个网站验证下,

![](https://img01-xusong.91q.com/E124567A-F867-4334-BDE4-DF81F4E1CC85.png)

没问题就是md5,就懒得继续分析,用Python还原跑一下

![](https://img01-xusong.91q.com/6EB531E7-DEF0-4DE0-B073-AD46266AD2B0.png)

很好没问题,贴上代码

```python
import hashlib
import time
import uuid
from urllib.parse import parse_qs, urlparse
import requests
bookruid=''
cookies = {}
headers = {}
stime = str(round(time.time()))
nonce = str(uuid.uuid4())
sign = hashlib.md5((str('123456') + nonce + stime).encode()).hexdigest().upper()
params = {
    'pinst': 'null',
    'nonce': nonce,
    'stime': stime,
    'sign': sign,
    'typecode': 'ebook',
}
data = requests.get(f'https://www.**.com/api/books/{bookruid}/pdf', params=params, cookies=cookies, headers=headers).json()
print(data['title'])
catalogs=data['catalog']
for catalog in catalogs:
    print(catalog['title'],'\t',catalog['page'])
print(data['filePath'])
o = parse_qs(urlparse(data['filePath']).query)
filePath=o['filePath']
pages=data['totalPage']
for page in range(0,pages):
    stime = str(round(time.time()))
    nonce = str(uuid.uuid4())
    sign = hashlib.md5((str('123456') + nonce + stime).encode()).hexdigest().upper()
    params = {
      'pinst': 'null',
      'nonce': nonce,
      'stime': stime,
      'sign': sign,
      'typecode': 'ebook',
    }
    params = [
      ('filePath',filePath
         ),
      ('readtype', 'pdf'),
      ('pageno', page),
      ('bookruid', bookruid),
      ('readtype', 'pdf'),
      ('nonce', nonce),
      ('stime', stime),
      ('sign', sign),
    ]

    response = requests.get('https://mirrorxz.**.com/ebookapissocore/api/OnlineEBook', params=params,
                            headers=headers)
    print("page:",page,response)
```

#### 第五种,啥也看不懂

pdf是加密的,加密解密在wasm里面

![](https://img01-xusong.91q.com/8A65FBAD-2368-4C60-802A-A90305CC63B3.png)

解密位置在这,wasm,里面的_decodeData方法

```javascript
decodeData(data) {
        var ptr = this._module._malloc(data.length);
        this._module.HEAPU8.set(data, ptr);

        this._module._decodeData(ptr, data.length);

        var output_array = new Uint8Array(this._module.HEAPU8.subarray(ptr, ptr + data.length));
        this._module._free(ptr);

        return output_array;
}
```

通常到这里了,要么分析wasm,还原算法,要么把wasm扣下来,但对于这个网站完全没必要,注意到,pdf是整个文件,那就根本没必要了,直接就hook整个pdf数据,在下载下来,省去复杂的解密过程

![](https://img01-xusong.91q.com/DCFD0AC3-5908-4856-9B63-0D8F1C8C91F8.png)

但这种仅限于,单个pdf,不然文件太多了,比较麻烦

### 其他

[云展网加密书籍算法解密](https://www.52pojie.cn/thread-1672614-1-1.html)

#### 随心所欲验证码型

![](https://img01-xusong.91q.com/C38568FE-BDAE-465B-926D-574AC92328BE.png)

#### 字体加密型

![](https://img01-xusong.91q.com/03D84B62-035D-4B3D-BBE3-F21828DAD9FE.png)

#### 他来他也不行

![](https://img01-xusong.91q.com/727A89C2-637C-4A12-BCB6-3E09DB5DE5DD.png)

最后这个相对比较麻烦,代码混淆了,而且不是一个两个代码混淆,还要封ip,封账号,解密还算比较容易,本地生成公私钥,返回后端公钥,后端再返回加密的key,前端再利用私钥解密,然后AES/ECB解密pdf。

基本web端纯pdf解密就这些了,大不了就是加密解密,混淆不太一样。
## 二、png格式

### 第一种,idm批量下载

![](https://img01-xusong.91q.com/5AC4AC42-3EC1-4362-BF56-082214BF5E9E.png)

除了page其他参数完全一样,直接用idm下载就行了

![](https://img01-xusong.91q.com/D6C97898-C042-4EB9-84E2-6413F082DA9A.png)

唯一要注意的就是通配符

比如有些编号是 000 0001 0111111,这种就需要设置通配符长度4

还有些对请求头有要求这种就可以考虑,用[逍遥一仙](https://www.52pojie.cn/home.php?mod=space&uid=293382)的下载器,或者自己写程序都比较简单

还有的是编号是十六进制



### 第二种,综合类

aHR0cHM6Ly9tcC56aGl6aHVtYS5jb20vYm9vay9zYW1wbGUyLmh0bT9jb2RlPTQ1MWEwZTYyYjEyJnNoYXJlXz0xNTUyMzc3MTk=

和 上面pdf,请求头加密同样的直接打开图片链接不行,阻止请求域,py跑两遍先,这就很离谱了啊,两次都不行

![](https://img01-xusong.91q.com/D2DA7C41-8922-425E-A11A-BADE38B641E6.png)

搜索关键字auth_key,定位相关代码

```javascript
{
                  t = "key1=" + r.key;
                  r = "key2=023" + Tools.getCookie(Tools.genCookieName(r.env));
                  var A = (new URL(d)).pathname
                      , v = Math.random()
                      , K = Date.parse(new Date) / 1E3 - parseInt(differenceDate) + 15;
                  A = CryptoJS.MD5(A + "-" + K + "-" + v + "-0-69731cbade6a64b58d60").toString();
                  t = urlAddParam(d, "auth_key=" + K + "-" + v + "-0-" + A + "&" + t + "&" + r);
                  e(t)
                }
```

离谱的事情就来了

![](https://img01-xusong.91q.com/6BF1BDC0-65D8-4B78-B5E4-0ADE3EC80F51.png)

稍微停了一下,几秒不到,链接就访问不了,这失效也太快了。

先分析一下,图片链接的参数

key1是[接口](https://mp.zhizhuma.com/ebookSampleService/sia.do)返回的,这个接口也有很多参数一会分析

key2,是cookie里面的_logkey_,貌似是随机生成的,

然后就是这个**auth_key**,比较麻烦

简单还原了一下

```python
t = "key1=" + sia.json()['data']['key']
r = "key2=023" + _logkey_
A = urlparse(imageUrl).path
K = str(int(time.time()) + 18)
v = str(random.random())
A = hashlib.md5((A + "-" + K + "-" + v + "-0-69731cbade6a64b58d60").encode()).hexdigest()
t = imageUrl + '?' + ("auth_key=" + K + "-" + v + "-0-" + A + "&" + t + "&" + r)
```

跑一下,没问题

![](https://img01-xusong.91q.com/F0D3F8D0-1F7A-4F0E-9736-486B471CFD2A.png)

然后就是key1这个[接口](https://mp.zhizhuma.com/ebookSampleService/sia.do)参数,具体方法在这里

```javascript
d = d || {};
d._timestamp = Date.parse(new Date) / 1E3;
d._nonce = requestUuidV4();
var e = window.ytLoggerData || {};
e.pageUrl && e.pageUrl.newUrl && (d.refer = e.pageUrl.newUrl);
var n = window.YTLogger;
n && n.deviceId && n.traceId && (e = n.deviceId(),
n = n.traceId(),
e && (d._deviceid = e),
n && (d._traceId = n));
e = "";
n = Object.keys(d).sort();
for (var t = 0; t < n.length; t++) {
    var r = n
      , A = d;
    if ("null" == A || null == A || void 0 == A || "undefined" == A)
      A = "",
      d = A;
    e += A + "" + r
}
d._sign = CryptoJS.MD5(e).toString().toUpperCase().substring(0, 20);
return d
```
要注意requestUuidV4(),并不能直接用py里面的uuid4,要稍微改一下

```javascript
function requestUuidV4() {
    return "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(//g, function(d) {
      var e = 16 * Math.random() | 0;
      return ("x" == d ? e : e & 3 | 8).toString(16)
    })
}
```

```python
def get_uuid():
    return str(uuid.uuid4()).replace("-",'')
```

还有_sign,取了大写MD5还要取前20位

```python
_sign=hashlib.md5((_deviceid+'_deviceid'+_nonce+'_nonce'+ts+'_timestamp'+_traceId+'_traceId'+imageUrl+'imageUrl').encode('UTF-8')).hexdigest().upper()
```

然后就是图片地址,找了半天都没找到,说明很可能是加密的,注意到有个[接口](https://biz.zhizhuma.com/ebookpageservices/queryPurchaseAllPageByEbookId/v2.do)返回的数据

```json
encrypted: true
encryptedData: "aSJcuVHA2HEFmUiq5SApZDxNRcMMQofnCufp3uU69XXP4Mk3Z
success: true
```

直接搜索encryptedData,下个断点刷新

![](https://img01-xusong.91q.com/3EFA7A04-1486-4EAB-BBB9-768D0B572EA9.png)

就是我们需要的数据,看下代码就是一个ECB

```python
response = requests.post(url,
                         cookies=cookies, headers=headers, data=data)
data=response.json()['encryptedData']
cryptor = AES.new(key='Suj4XDDt3jPsH9Jj'.encode(), mode=AES.MODE_ECB,)
de = json.loads(unpad(cryptor.decrypt(base64.b64decode(data)), AES.block_size))
```

批量跑一下

![](https://img01-xusong.91q.com/FE1E77D4-6939-491E-A047-217B9B446BEA.png)

很好没问题,原本到这里应该结束了,结果。

![](https://img01-xusong.91q.com/21BC895B-B18F-4395-A2D0-5AC0B788C6EF.png)

就搞人心态,继续分析图片的解密,翻到加密那页之前下个xhr,根据堆栈可以发现,在这里

![](https://img01-xusong.91q.com/A69C5848-1072-4327-8A30-3116D0C11FB6.png)

在跟进去,很明显了,就是解密的位置,一开始判断是否加密,加密就解密

```javascript
ImgBytes = {
    render: function(d, e, n) {
      if (!isEmpty(imgBytes) && 1 == d) {
            var t = new XMLHttpRequest;
            t.open("GET", n, !0);
            t.responseType = "arraybuffer";
            t.onload = function(r) {
                r = t.response;
                for (var A = new Uint8Array(r), v = new Uint8Array(r.byteLength), K = Math.floor(.45 * r.byteLength), B = Math.floor(.55 * r.byteLength), E = 0; E < r.byteLength; E += 1)
                  v = E >= K && E < B ? imgBytes] : A;
                r = v.buffer;
                r = new Blob(,{
                  type: ""
                });
                var l = URL.createObjectURL(r);
                $(e).attr("src", l).on("load", function() {
                  window.URL.revokeObjectURL(l)
                })
            }
            ;
            t.send()
      }
    },
    getImgFormat: function(d) {
      0 < d.indexOf("?") && (d = d.substring(0, d.indexOf("?")));
      return d.substring(d.lastIndexOf("."))
    }
}
```

主要的解密部分就是那个for循环,多了个参数imgBytes,再根据堆栈回推,就是一开始ECB解密后里面的canvas_info

```javascript
             imgBytes = t.canvas ? $.parseJSON(t.canvas).canvas_info : "";

for (var A = new Uint8Array(r), v = new Uint8Array(r.byteLength), K = Math.floor(.45 * r.byteLength), B = Math.floor(.55 * r.byteLength), E = 0; E < r.byteLength; E += 1)
                v = E >= K && E < B ? imgBytes] : A;


```

用Python还原一下

```python
def jiemi(pageNo, down_url, canvas):
imgBytes = canvas
    z = requests.get(url=down_url, stream=True).content
    K = math.floor(.45 * len(z))
    A = math.floor(.55 * len(z))
    v = * len(z)
    for G in range(len(z)):
      if G >= K and G < A:
            v = imgBytes]
      else:
            v = z
    with open('' + str(pageNo) + '.jpg', 'wb') as f:
      f.write(bytes(v))
```

很好解密没有问题

![](https://img01-xusong.91q.com/420EC491-0914-4626-B041-B263DDB7E82E.png)



总结一下

先根据[这个接口](https://biz.zhizhuma.com/ebookpageservices/queryPurchaseAllPageByEbookId/v2.do),拿到加密的数据

再ECB解密数据拿到url,canvas_info,encrypt

再[这个接口](https://mp.zhizhuma.com/ebookSampleService/sit.do)拿一个key1

然后生成图片地址,返回数据

如果是加密的再进行解密,保存

总的来说,并不难,主要是动态调试,那个地址失效太快了

最后提示一点,注意到图片地址,开头sample img tmp,说明很可能是临时缓存,可以直接改host拿到永久的地址,就用不到分析图片地址加密参数,这种就类似于某可知对外售卖的平台

![](https://img01-xusong.91q.com/CE0D90AC-90BA-4E6E-B070-DC1E3B2DA42B.png)

### 其他

#### 不知道取啥名

这个和综合类的解密部分基本差不多,扣js就行,看起来镜像翻转,再还原右边

![](https://img01-xusong.91q.com/69778AA9-36A9-476F-9EE0-B09E153B70E1.png)

#### 分块

![](https://img01-xusong.91q.com/1BE7B992-9958-4D3E-B4E0-4E2BF79A8A0C.png)

这种通常需要找到,拼接顺序,各个图片位置,这种只分了几块的,直接看都看的出来了,但对于很多漫画类以及藏品动不动就几百就需要分析js。

除此之外,对于上图这种阅读器,某个公司的,可以直接打印整张png,也可以直接拿到源pdf,目前遇到几个网站都可以。

## 三、epub格式

### 第一种,混淆+AES

一来就是个debugger,下面还是jsjiami,原本打算还原的,结果发现下面很明显就是一个cbc,解密,先跑一下

![](https://img01-xusong.91q.com/AF4E4729-FB57-471B-BDAB-512AA2D2C3D9.png)

就是我们需要的东西,懒得还原了,论坛有很多

![](https://img01-xusong.91q.com/B8AEC60E-0044-4FF5-8981-7F67D3543C59.png)

### 第二种,RSA,DES,AES

某才app

随便打开一本书,注意链接,人家都提示了,mobileAes,没什么好说的,先hook一下

![](https://img01-xusong.91q.com/461FA60A-9852-4481-925C-AFAACE4695ED.png)

就是先DES 解密 ,得到key,在AES解密,epub内容

![](https://img01-xusong.91q.com/06C24C9C-1BC7-4D58-B4A8-250A75834AD7.png)

然后就是getkey,里面参数加密的

![](https://img01-xusong.91q.com/3235F56D-704B-4FBE-8533-8113A6A6CC45.png)

直接常用加密hook不到,用jadx查看

![](https://img01-xusong.91q.com/B24EFA58-CAA0-4B23-A5DC-6C39A424868A.png)

很容易找到这,就是个RSA,但不知道为啥直接hook不到

跟进去,很明显了,RSA和des都在这里,继续跟一下

```
    public static String requestByRSA(Context context, String str, JSONObject jSONObject) {
      if (!checkNet(context)) {
            return null;
      }
      HttpPost httpPost = new HttpPost(ToolsUtil.setshuProxy(str));
      try {
            httpPost.setEntity(new StringEntity(RSAResquest.rsaEncode(jSONObject), "UTF-8"));
            HttpResponse request = request(context, httpPost);
            if (request == null) {
                return "";
            }
            if (request.getStatusLine().getStatusCode() == 200) {
                return new String(RSAResquest.desDecrypt(EntityUtils.toString(request.getEntity(), "UTF-8").replace("\n", "").replace("\r", "").getBytes()), Charset.forName("UTF-8")).replace("\n", "").replace("\r", "");
            }
            return null;
      } catch (Exception e) {
            e.printStackTrace();
            return null;
      }
    }
```

就很离谱了,居然都是明文

![](https://img01-xusong.91q.com/8FD760E9-57CF-435B-B569-E9AC53A75323.png)

自定义,重新hook一下

![](https://img01-xusong.91q.com/71B33571-E9AD-453D-9809-1046A606EE93.png)

很清楚了,还有个token,一开始还以为很麻烦,分析了好久,结果发现就是现成的

就在每个epub的toc.ncx里面,

<encrypt>/</encrypt>

至于其他的还有些参数,比如epub链接的解密,就是des,就不分析了。

用py还原一下,没问题

![](https://img01-xusong.91q.com/9DD1C232-9EA9-4467-9760-0D1020E0987A.png)

贴上部分代码

```python
import json
import re
import uuid
import logging
import random
import requests
import base64
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5, AES
from Crypto.PublicKey import RSA
from Crypto.Util.Padding import unpad
from pyDes import *
def get_Rsa(data):
    key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwIbK7LEP3b5y0UabUG9ZD71GUGTOf0lPPDnrDE1+6DK+t/giyQQfBHqeCHe7MQtoGFzxsWfZyWlEoWtB1cO3TzP+f8lm4PxpRAJ7uTaDepUyBltsj264D8xdaCweqNRfxu3CpKDAmRaN7HGxZLP6nVITy66SdZtS7vFZIj3uehKRW1VNqGUm+S4wtmV+IGHJW1of8mIXe7jDGzXtwh2aF65Gd2IaHlDzqTT0dr6xgJaRrSgMrquVE66pFZhvebn5bHfEZws3CJ34Mx5Kps/EQbWn6w8MpKs85Kl+ZMJ+CnJ6R66B2Zcio6U4Evn3sLp0KaGXuCItmZXqTD3p6Hsj7QIDAQAB'
    public_key = '-----BEGIN PUBLIC KEY-----\n' + key + '\n-----END PUBLIC KEY-----'
    rsakey = RSA.importKey(public_key)
    cipher = Cipher_pksc1_v1_5.new(rsakey)
    cipher_text = base64.b64encode(cipher.encrypt(data.encode()))
    return cipher_text.decode()
def get_Des(res):
    Des_Key = "1a2s3d%*"
    Des_IV = "%*1a2s3d"
    k = des(Des_Key, CBC, Des_IV, pad=None, padmode=PAD_PKCS5)
    b64str = base64.b64decode(res)
    return k.decrypt(b64str).decode()
def get_AES(data):
    Aes_Key = "1a2s3d%*1a2s3d%*"
    Aes_IV = "%*1a2s3d%*1a2s3d"
    cryptor = AES.new(key=Aes_Key.encode(), mode=AES.MODE_CBC, iv=Aes_IV.encode())
    dekey = cryptor.decrypt(base64.b64decode(data))
    return unpad(dekey, 16).decode()
def get_Token(url):
    res = requests.get(url=url).text
    token=re.findall('<encrypt>(.+?)</encrypt>',res)
    #print(token)
    #print(res)
    return get_kv(token)
```

## to be continued

就先这样了,后面的有机会在写,写完这个,摸鱼生活正式结束了,给自己放两周假

涛之雨 发表于 2022-8-13 09:58

写了这么多情况。。。。
tql。。。
懂逆向的和不懂逆向的都沉默了

andyarmy 发表于 2022-8-12 16:42

干货多真好!
请问一下,国家标准公开网(https://openstd.samr.gov.cn/bzgk/gb/)
里面都是pdf,但是是图片调用(viewGbImg?fileName=)显示,
这种,该如何下载pdf文件呢?有什么思路?
求教!

nvecaiwang 发表于 2022-8-15 11:52

我去……这种文章真的牛啊,从破解的思路到手段都非常清晰

想认真的请教楼主,正儿八经的自己学破解现在需要学哪些软件?

另外有啥教科书,或者视频可以推荐看看吗?

GNLCP 发表于 2023-5-20 09:50

老哥,我来求一份资料,c++ prime 第五版非 扫描版的,大佬看到的话帮发一份到luckyman6869@163.com吧,求求了,或者我发个悬赏也行啊

Sephdex 发表于 2022-8-11 23:08

膜拜,学习,收藏

Garfiel 发表于 2022-8-11 23:12

必须支持大佬

lansemeiying 发表于 2022-8-11 23:14

非常不错的啊

lujiluji 发表于 2022-8-11 23:17

支持大佬牛逼牛逼

Mofecx 发表于 2022-8-11 23:19

感觉很齐全,厉害

也许偏听 发表于 2022-8-11 23:37

学习起来

xy0225 发表于 2022-8-12 00:05

谢谢分享

kurokihitomi 发表于 2022-8-12 00:31

必须支持大佬
谢谢分享

penz 发表于 2022-8-12 00:41

厉害,学习了
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 在线阅读文档解密