关于XX文库在线阅读PDF的技术分析(2024.10.12版本)

查看 134|回复 12
作者:OpenSSL2020   
前一段时间XX文库出现了一个bug,在线阅读PDF给的是无加密的版本,当时爬虫很多导致访问速度变慢,为了防范爬虫弄了验证码和IP访问限制,就在前几天终于把这个bug修好了,具体时间也许有出入,不过这并不重要,重要的是新版本PDF全部换成了DRM加密的,经过我的分析XX文库其实用了Foxit PDF SDK的DRM加密,不出意外的使用了wasm,凭我的水平是无法逆向出来加密算法的,但我想到了一个曲线救国的方法,在我查看Foxit PDF SDK资料的时候发现,完整功能的在线PDF阅读是包含打印功能的,而XX文库把打印功能禁用了,因此我只需要用Foxit PDF SDK在本地搭一个服务器,然后用XX文库的DRM信息进行解密就可以本地查看PDF了,然后本地可以打印PDF,至此就完成了曲线救国的方法,此时还有个小问题,打印的PDF会缺失目录,直接通过Foxit导出目录比较麻烦,需要对他的库很熟悉再进行hook应该可以实现,但我发现了更简单的方法,在书籍详情页是有目录的,只需把网页的目录拿到格式化输出即可,最开始想着对网页标签元素下手,在用ChatGPT写了一些代码后发现不怎么好处理层级关系,然后就想着能不能绕过,也许目录数据是异步加载渲染的,最终发现目录直接存在vNodes数组变量中,后面的事情就简单了,和ChatGPT沟通后写出了导出目录的js代码,直接在console中运行即可,上面的思路我都已经实现了,由于我写的只是思路,因此并没有给出技术细节,具体的细节留给大家去探索,第一次发技术帖还是有点小激动的,上面看似轻描淡写给出的思路,实际上是经过很多探索得到的,因此想着发帖纪念一下,最后附上导出目录的代码吧:
[JavaScript] 纯文本查看 复制代码
// 定义一个变量存储所有输出的文本块
var output = "";
// 定义一个函数来计算层级,直到 pId = 0
function getIndentLevel(node, nodes) {
    let level = 0;
    let currentNode = node;
    // 遍历找父节点,直到 pId = "0"
    while (currentNode.pId !== "0") {
        level++; // 每找到一层父节点就增加一级缩进
        currentNode = nodes.find(n => n.id === currentNode.pId); // 找到父节点
    }
    return level;
}
// 遍历 zNodes 数组
for (var i = 0; i

文库, 目录

OpenSSL2020
OP
  


lu_wakin 发表于 2024-10-14 08:36
打印PDF很简单,直接用浏览器自带的打印功能就行,打印之前F12把不要的元素都删了,打印出来就很干净了

直接打印不行啊,又不给你读全文。
google88   

如果可以的话希望多记录一些过程,
可以当个备忘录,更可以给他人以启迪。
授人以鱼不如授人以渔,
没必要专门去传授,但是希望可以记录一下过程,启迪有缘人
哦对了,如果写的话麻烦关键位置打码,不然方法容易挂掉
sdieedu   

之前有一个xx文库,非会员只能在线查看,不能下载。我也是通过分析绕过限制,获取到了真实pdf文件,然后实现了全站所有pdf下载。因为图书比较老,也没有多少我感兴趣的,所以玩一阵后放下了。前一阵再用就能不能用了。这个站可能发现这个bug了,就改版了。
heshangdasan   

需要用Foxit PDF SDK在本地搭一个服务器,然后用XX文库的DRM信息进行解密就可以本地查看PDF了,然后本地可以打印PDF
如何实现的
user1997   

高人在民间,楼主辛苦了
hbzy   

感谢分享
onceok   

虽然我看不懂,但我很赞同
张向华   

感谢楼主分享,大神们继续
BilboBaggins   

太高深了谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

返回顶部