前一段时间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中运行即可,上面的思路我都已经实现了,由于我写的只是思路,因此并没有给出技术细节,具体的细节留给大家去探索,第一次发技术帖还是有点小激动的,上面看似轻描淡写给出的思路,实际上是经过很多探索得到的,因此想着发帖纪念一下,最后附上导出目录的代码吧:
// 定义一个变量存储所有输出的文本块
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 < zNodes.length; i++) {
var currentNode = zNodes[i];
var name = currentNode.name;
var url = currentNode.url;
// 使用正则表达式提取 bookPageNum
var bookPageNumMatch = url.match(/bookPageNum=(d+)/);
var bookPageNum = bookPageNumMatch ? bookPageNumMatch[1] : "No bookPageNum";
// 计算当前节点的缩进级别
var indentLevel = getIndentLevel(currentNode, zNodes);
// 用制表符缩进
var indent = "t".repeat(indentLevel);
// 将当前节点的 name 和 bookPageNum 通过制表符分隔,并追加到输出文本中
output += indent + name + "t" + bookPageNum + "n";
}
// 最后一次性输出整个文本块
console.log(output);
· 今 日 推 荐 ·
PC逆向 -- 系统调用
扫描二维码下载学习视频
本文内容来自网络,如有侵权请联系删除
原文始发于微信公众号(逆向有你):JS逆向 -- 关于某文库在线阅读PDF的技术分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论