某网站的求助帖为例:

提问

Comparing IFRS Accounting Standards and U.S. GAAP: Bridging the Differences (September 2025) | DART – Deloitte Accounting Research Tool

网页内嵌的 pdf,请帮忙下载,因为该网站有好多类似的文章,还请介绍如何突破限制,下载该网站的其他类似内容

下载链接

f12,定位到 pdf 渲染层(页面嵌套)


执行 PDFViewerApplication.download() 即可(基本上通用)

以下是 pdf 文件链接的下载链接

https://dart.deloitte.com/USDART/ov-resource/057be505-289e-11e9-818d-67c85cbcc7fa#pdfjs.action=download

(下是应该能下,但是太慢啦)

pdf.js 应该是通用的,除非服务器做了限制(也有办法绕过然后保存)

找到密码

使用特殊(对于 L 站为准入门槛)网咯下载后,发现有密码。
先说该网站结论:

  1. 找到 id 为 r0inab 的 script 标签的内容,
    例如:Business Combinations (November 2025) | DART – Deloitte Accounting Research Tool ,(没错我另起炉灶了)
    pdf.js 通用 pdf 下载教程3
    搜索得到加密后的密钥:2s1e1k2p1d1j2t2p1e1g1d1h172u1g1j2p171k2t1d1d172s1h2p2u171f2u2q1c1g1f2u1j

  2. 计算密钥

    function decode(encodedString) {
        let result = '';
        for (let o = 1; o < encodedString.length; o++) {
            if (o % 2 === 1) {
                const charCode = parseInt(encodedString[o-1] + encodedString[o], 36);
                result += String.fromCharCode(charCode);
            }
        }
        return result;
    }
    
    const encoded = "2s1e1k2p1d1j2t2p1e1g1d1h172u1g1j2p171k2t1d1d172s1h2p2u171f2u2q1c1g1f2u1j";
    console.log(decode(encoded));
    

    得到密码:d28a17ea2415+f47a+8e11+d5af+3fb043f7

  3. 即可解开啦

PS: 如果希望去除密码,最简单的方法就是在线 pdf 解锁网站,比如 https://www.ilovepdf.com/zh-cn/unlock_pdf

还有就是要多换几个软件试试,可能是软件 bug,chrome 和 2345pdf 阅读器说密码不对,但是 edge、福昕 pdf 编辑器、上面那个 pdf 解锁网站则可以正确打开。。。

追码过程(通用)

pdf.js 中搜索 .onPassword


如果手速不够快可能需要刷新,
如果存在密码的话可能会在此处断下,并且报错 No password given
如图中所示,此处的 e.onPassword 则是自动传输密码的必经之路。
如果偷懒,可以在 e.onPassword 的第一回调参数(也就是上面的 s 函数)下断点,

即可直接偷鸡。

当然,本例追过去,发现

onPassword = (e, t) => {
    this.isViewerEmbedded && this._unblockDocumentLoadEvent(),
    window.addEventListener('message', function t(i) {
        window.removeEventListener('message', t)
        for (var n = i.data, s = '', o = 1; o < n.length; o++)
            o % 2 && (s += String.fromCharCode(parseInt(n[o - 1] + n[o], 36)))
        e(s)
    }),
    window.parent.postMessage('s', location.href)
}

然后追到 s 的监听换事件

//外层 function onMessage(e) {
e.origin === location.protocol + "//" + location.host && (e.data === String.fromCharCode(115) ? e.source.postMessage(JSON.parse(document.getElementById("r0inab").innerText), location.href) : e.data === String.fromCharCode(103) && e.source.postMessage(JSON.parse(document.getElementById("r0inyk").innerText), location.href));
}

最终算法参考本文 [找到密码] 部分

↓能不能别点赞,点点别的, 不想吃 LDC 低保


📌 转载信息
原作者:
taozhiyu
转载时间:
2026/1/24 06:54:06

标签: none

添加新评论