PubMed PDF下载 cloudpmc-viewer-pow逆向

目标:https://pmc.ncbi.nlm.nih.gov/articles/

pdf的下载链接是直接存在的

但是第一次单击下载不会触发PDF下载,而是跳转到验证页面然后又跳回概览页面

再次点击下载按钮,PDF就能正常下载了。现在要分析下载PDF要验证什么,如cookie之类的

通过分析第二次访问PDF的下载链接,发现只需要验证cloudpmc-viewer-pow ,其他cookie无需验证,下面分析cloudpmc-viewer-pow是在哪里产生的。

查看第一次访问PDF下载链接的请求,响应的set-cookie中并不包含 cloudpmc-viewer-pow,但是响应体中包含了类似的内容

通过对比发现,cloudpmc-viewer-pow比POW_CHALLENGE多了一串数字(%2C是逗号)

即cloudpmc-viewer-pow的格式是

bash 复制代码
cloudpmc-viewer-pow = POW_CHALLENGE,数字

接下来要分析的是这个数字是怎么生成,毋庸置疑,这个数字肯定是本地生成的,不是服务器产生的,而且跟POW_CHALLENGE有关。开始逆向分析。

但是直接下断点有些困难,因为第一次访问PDF下载链接后会返回上一个页面,打不了断点,可以通过hook等手段阻止他返回。这里使用一种简单无脑的方法,直接把网页保存到本地分析,在本地运行该网页发现cloudpmc-viewer-pow可以正常生成,说明js代码中不会验证域名,所以该方法可行。

复制到本地的网页:

首先要注释掉pow-dbe6590f.js中的跳转页面方法,太烦人了

这样网页就不会跳转,方便下断点,而且cloudpmc-viewer-pow正常生成

但是断点打在哪里呢?我们需要的是cloudpmc-viewer-pow生成的地方打断点,那cloudpmc-viewer-pow是什么?cloudpmc-viewer-pow最后是作为cookie使用,那肯定有cookie值变化的时候,这时候借助油猴插件JS Cookie Monitor/Debugger Hook ,这个插件用于监控js对cookie的修改。

可以看到cloudpmc-viewer-pow cookie赋值的地方已经出现了

bash 复制代码
vendor-5350ab81.js:93:5973

直接点进去下断点

查看变量值发现数字包含在变量s中,而s是从外部传入的,而不是在当前函数中生成的,所以在调用堆栈中往前找。

在init中发现了数字生成的地方,赋值给了a

javascript 复制代码
const a = d(e, i);

数字的具体值就在函数d返回的nonce中,下面找到函数d的实现就可以了。

进入函数d声明的地方:

然后开始扣代码

javascript 复制代码
const e = "****************************";//POW_CHALLENGE

function d(e, n = 4) {
    let o = 0;
    const r = "0".repeat(n);
    for (;;) {
        const c = e + o.toString();
        const i = p.create().update(c).hex();
        if (i.startsWith(r)) {
            return {
                nonce: o,
                hash: i,
                challenge: e,
                difficulty: n
            };
        }
        o++;
    }
}

const i = 4;
const a = d(e, i);
console.log(a);

运行发现p没有定义

往前找p

一大堆代码,看着SHA256的出现次数那么多,猜测p应该就是用来进行SHA256的,就不继续扣代码了,直接交给ai梭哈

最后实现的代码就是

javascript 复制代码
const CryptoJS = require("crypto-js");

// 定义 p 为 SHA256 哈希函数
const p = {
    create: () => ({
        update: function(data) {
            this.data = data;
            return this;
        },
        hex: function() {
            return CryptoJS.SHA256(this.data).toString(CryptoJS.enc.Hex);
        }
    }),
    update: function(data) {
        return this.create().update(data);
    }
};


const e = "****************";//POW_CHALLENGE

function d(e, n = 4) {
    let o = 0;
    const r = "0".repeat(n);
    for (;;) {
        const c = e + o.toString();
        const i = p.create().update(c).hex();
        if (i.startsWith(r)) {
            return {
                nonce: o,
                hash: i,
                challenge: e,
                difficulty: n
            };
        }
        o++;
    }
}

const i = 4;
const a = d(e, i);
console.log(a);
相关推荐
搞科研的小刘选手1 小时前
【同济大学主办】第十一届能源资源与环境工程研究进展国际学术会议(ICAESEE 2025)
大数据·人工智能·能源·材质·材料工程·地理信息
MARS_AI_1 小时前
云蝠智能 VoiceAgent 2.0:全栈语音交互能力升级
人工智能·自然语言处理·交互·信息与通信·agi
top_designer1 小时前
Substance 3D Stager:电商“虚拟摄影”工作流
人工智能·3d·设计模式·prompt·技术美术·教育电商·游戏美术
前端互助会1 小时前
Live2D形象展示与文本语音播报:打造生动交互体验的完整实现
前端·vue.js·microsoft·交互
雷神大青椒1 小时前
离别的十字路口: 是否还记得曾经追求的梦想
人工智能·程序人生·职场和发展·玩游戏
m0_650108242 小时前
多模态大模型 VS. 图像视频生成模型浅析
人工智能·技术边界与协同·mllm与生成模型·技术浅谈
ai_xiaogui2 小时前
Mac苹果版Krita AI一键安装教程:AIStarter+ComfyUI零基础部署全流程(X86/ARM双架构)
arm开发·人工智能·macos·comfyui·一键部署·ai绘画教程·kritaai
lapiii3583 小时前
[智能体设计模式] 第11章:目标设定与监控模式
人工智能·设计模式
这张生成的图像能检测吗3 小时前
(论文速读)WFF-Net:用于表面缺陷检测的可训练权重特征融合卷积神经网络
人工智能·深度学习·神经网络·缺陷检测·图像分割
chilavert3183 小时前
技术演进中的开发沉思-191 JavaScript: 发展历程(上篇)
开发语言·javascript·ecmascript