好友
阅读权限10
听众
最后登录1970-1-1
|
之前一直用这个油候插件下载GB688的相关标准
今年网站进行了改版失效了
开发者发现进行加密后没再继续开发
放出了教程
太专业了我实在看不懂发出来大家一起研究研究吧
1. 前言2021年前, gb688手机版使用的明文pdf, 可直接下载, 不需要额外处理
2021年开始, 新站openstd, 开始全面启用 [color=var(--color-text-link)]pdf.js, 至此, 手机版也使用与pc同样加密技术[color=var(--color-text-link)]2. 文件预览openstd文件以两种方式开放给用户, 一种为直接下载, 另一种为在线预览
直接下载的文件有DRM保护, 需使用网站提供的工具打开
在线预览的文件使用 pdf.js, 浏览器解密后在线呈现给用户
因为浏览器管理较为困难, 且容易改造, 对于要求不高的用户, 可以使用打印功能将文件打印为纸质文件或PDF文件
亦可使用无头浏览器 (headless), 对网站文件进行批量获取[color=var(--color-text-link)]3. 文件载入既然可以使用 pdf.js 进行预览, 说明必定有PDF文件进行载入
通过浏览器工具可知, 载入的文件并非明文, 而是加密后的Base64字符串, 并且使用了懒加载 (lazyload), 分段进行载入
下面通过 [color=var(--color-text-link)]GB 39732-2020 (汽车事件数据记录系统) 为例, 来分析其载入过程
[color=var(--color-text-link)]3.1点击 "在线预览" 按钮后, 浏览器跳转至 [color=var(--color-text-link)]预览页面
在此页面中包含变量 var HCNO="e+fr0OSr1Px3S3phy72jth0Hq3HBZZ+ZDXKIbZQEWVeWUhQ7hYT4ELgJTdrFvtx9lSgoZL0ew6+0DcVriDfUeMIK59fQUGvHqO8h3Ps31m4=", 记录了加密PDF文件所使用的密钥 (key) 和初始向量 (iv)
其自身为密文, 通过网站编译的 pdf-work.wasm 中的固定参数进行解密, 之后在浏览器中初始化
[color=var(--color-prettylights-syntax-variable)]Module.[color=var(--color-prettylights-syntax-entity)]onRuntimeInitialized [color=var(--color-prettylights-syntax-constant)]= [color=var(--color-prettylights-syntax-keyword)]function () { [color=var(--color-prettylights-syntax-keyword)]var ptr [color=var(--color-prettylights-syntax-constant)]= [color=var(--color-prettylights-syntax-entity)]allocateUTF8([color=var(--color-prettylights-syntax-constant)]HCNO); [color=var(--color-prettylights-syntax-keyword)]var retPtr [color=var(--color-prettylights-syntax-constant)]= [color=var(--color-prettylights-syntax-variable)]Module.[color=var(--color-prettylights-syntax-entity)]_init(ptr); [color=var(--color-prettylights-syntax-constant)]HCNO [color=var(--color-prettylights-syntax-constant)]= [color=var(--color-prettylights-syntax-variable)]UTF8ToString(retPtr); [color=var(--color-prettylights-syntax-constant)]DEFAULT_URL [color=var(--color-prettylights-syntax-constant)]+= [color=var(--color-prettylights-syntax-constant)]HCNO; [color=var(--color-prettylights-syntax-storage-modifier-import)]console.[color=var(--color-prettylights-syntax-entity)]log([color=var(--color-prettylights-syntax-constant)]DEFAULT_URL); [color=var(--color-prettylights-syntax-keyword)]if ([color=var(--color-prettylights-syntax-storage-modifier-import)]document.[color=var(--color-prettylights-syntax-constant)]readyState [color=var(--color-prettylights-syntax-constant)]=== [color=var(--color-prettylights-syntax-string)]"interactive" [color=var(--color-prettylights-syntax-constant)]|| [color=var(--color-prettylights-syntax-storage-modifier-import)]document.[color=var(--color-prettylights-syntax-constant)]readyState [color=var(--color-prettylights-syntax-constant)]=== [color=var(--color-prettylights-syntax-string)]"complete") { [color=var(--color-prettylights-syntax-entity)]webViewerLoad(); } [color=var(--color-prettylights-syntax-keyword)]else { [color=var(--color-prettylights-syntax-storage-modifier-import)]document.[color=var(--color-prettylights-syntax-entity)]addEventListener([color=var(--color-prettylights-syntax-string)]"DOMContentLoaded", webViewerLoad, [color=var(--color-prettylights-syntax-constant)]true); }}解密后得到 ****************:################:CC68F6BFD3E104560914271598AFE8C8, 其中
**************** 为密钥
################ 为初始向量
CC68F6BFD3E104560914271598AFE8C8 为hcno
[color=var(--color-text-link)]3.2拿到密钥和初始向量后, 开始请求加密文件GET http://c.gb688.cn/bzgk/gb/viewGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8 HTTP/1.1Host: c.gb688.cnConnection: keep-aliveUser-Agent: Mozilla/5.0 ********************************Accept: */*Referer: http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8Accept-Encoding: gzip, deflateAccept-Language: ********************************Cookie: JSESSIONID=********************************服务器返回HTTP/1.1 200 OKServer: nginx/1.17.9Date: ***, ** *** **** **:**:** GMTContent-Type: Content-Type: application/octet-streamContent-Length: 2967097Connection: keep-aliveAccept-Ranges: bytesContent-Range: bytes 0-2967096/2967097此过程中没有发生文件传输, 而是从返回头中获得了文件大小, 即 Content-Range: bytes 0-2967096/2967097
紧接着正式开始请求文件GET http://c.gb688.cn/bzgk/gb/viewGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8 HTTP/1.1Host: c.gb688.cnConnection: keep-aliveUser-Agent: Mozilla/5.0 ********************************Accept: */*Referer: http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8Accept-Encoding: identityAccept-Language: ********************************Cookie: JSESSIONID=********************************Range: bytes=0-327679其中 Range: bytes=0-327679 即为请求的文件块
服务器返回HTTP/1.1 206 Partial ContentServer: nginx/1.17.9Date: ***, ** *** **** **:**:** GMTContent-Type: Content-Type: application/octet-streamContent-Length: 436928Connection: keep-aliveAccept-Ranges: bytesContent-Range: bytes 0-327679/2967097oYXL8/L6bpf0dcXYt862fxd+BOqPP2UYS1W/wxsGmxT7sSsU+cJkj33GTDmJxCq37p5tqIFmaYQVWNL88XredoArMcIpzsuaSTeL1Nj/t9CQCiQA8yFQmZOIQTp3vyXo[more]得到数据后进行解密, 载入到 pdf.js 中
用户下拉时再继续请求, 直到最后一块GET http://c.gb688.cn/bzgk/gb/viewGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8 HTTP/1.1Host: c.gb688.cnConnection: keep-aliveUser-Agent: Mozilla/5.0 ********************************Accept: */*Referer: http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8Accept-Encoding: identityAccept-Language: ********************************Cookie: JSESSIONID=********************************Range: bytes=2949120-2967096HTTP/1.1 206 Partial ContentServer: nginx/1.17.9Date: ***, ** *** **** **:**:** GMTContent-Type: Content-Type: application/octet-streamContent-Length: 23980Connection: keep-aliveAccept-Ranges: bytesContent-Range: bytes 2949120-2967096/29670977x/AI3CelgQLKM3uZOKMbuApo9I1NYbaEpZ9diKXfGuljC3S2p/t80GdRHLu6ybPSwED9bx4nkJXtEijAM9ben6g4CdO1UC85aTGxpWKpoh4umqfibsh3jTYkSnAoZtd[more]至此, 文件载入结束
原文地址:
https://github.com/lzghzr/TampermonkeyJS/issues/27
https://gist.github.com/lzghzr/858067598cf590af4c1b7d8faa211d21 |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|