Python 爬虫进阶必备 | 某采购网站 cookie 加密分析(仿加速乐)

咸鱼学Python

共 4170字,需浏览 9分钟

 · 2021-04-12

点击上方“咸鱼学Python”,选择“加为星标
第一时间关注Python技术干货!

今日网站

aHR0cDovL3RkLmVidXkuY3NlbWMuY29tL2V4cC9xdWVyeWJ1c2luZXNzL2NvbW1vbi94amdnSW5mby5kbz9mcGhtPVhKMDIxMDQxMjAwMzE2

这个网站来自咸鱼的 js 逆向交流群

这个网站的加密是请求时的 cookie

加密定位

直接访问网站,可以通过请求的网页链接看到请求的网页源码

直接复制请求到 postman 中测试也能获取到网页的内容

但是去掉 header 中的 cookie 值就会返回一段 js

多次测试之后,我们发现只要不携带 cookie 中的_ydclearance 就会返回上面的 js,所以这段 js 就是网站用来校验我们的

我们需要的就是分析出 js 是如何生成 cookie 中的_ydclearance就可以了

加密分析

先看看这段 js 都干了什么事情

window.onload=setTimeout("mq(141)"200); function mq(VF{var qo, mo="", no="", oo = [0xe5,0xb3,0x8e,0xd7,0x0d,0x1d,0x42,0x97,0xf6,0x2a,0x14,0xf3,0x3d,0x5e,0xbf,0xa8,0xc1,0x1f,0x74,0x3a,0xf9,0x8b,0x0d,0x4a,0x9d,0xa4,0xed,0x11,0x66,0xb3,0xcc,0x34,0x41,0xa0,0xe9,0x0b,0x60,0x26,0x79,0xc0,0xc5,0xb1,0x5b,0xaa,0x66,0x8c,0x80,0x36,0x4b,0x07,0x3a,0xe9,0x39,0xea,0x32,0xa5,0xf8,0xa6,0xf5,0xb3,0x0d,0xfa,0xa8,0xfb,0x0b,0x88,0x76,0x83,0x69,0xb0,0xcf,0x1f,0x6c,0x20,0xc5,0xa1,0x55,0x0b,0x5e,0x0c,0xe3,0x89,0x45,0x3b,0xe6,0xfc,0xa6,0x4c,0x9b,0x4f,0x28,0xdd,0x2d,0x7c,0x2a,0xae,0xc3,0xaf,0xc4,0xba,0x5b,0x03,0xf6,0x9c,0x4a,0x83,0x73,0x21,0xdc,0x84,0x9a,0x4e,0x3c,0xe9,0x9f,0x5f,0x13,0xcc,0x98,0xed,0xb2,0xed,0x19,0x76,0x9d,0xdc,0x32,0x5b,0x21,0x86,0xff,0x21,0x80,0x24,0xef,0x5a,0x08,0xef,0x95,0x23,0x6d,0x98,0xff,0xa5,0x4d,0x08,0xf5,0x81,0x6f,0x25,0x3b,0xf2,0x9a,0x50,0x08,0xf4,0xaa,0x5e,0x2a,0xbb,0xce,0x74,0xe7,0xa1,0x6d,0xe7,0x3b,0x5c,0x81,0xce,0xa1,0xfe,0x1e,0xe3,0x83,0x61,0xaa,0xd3,0x29,0x4e,0x01,0x4a,0x2a,0x73,0x94,0x41,0xa6,0x60,0x2c,0x57,0xaf,0xfc,0x30,0x4b,0x11,0x19,0xfa,0x8c,0x46,0xb7,0xfe,0x1c,0x7b,0x8e,0xef,0xe5,0x17,0xf6,0x0a,0x6b,0xc1,0x0b,0x80,0xa5,0xfa,0xcb,0x2b,0x5e,0x3e,0x61,0x0f,0x70,0xb9,0xc6,0x3a,0x17,0x74,0x95,0xf4,0xba,0xbe,0x50,0x32,0x47,0x82,0x5b,0x86,0x68,0x95,0xca,0x40,0x55,0xbc,0xf9,0x01,0x6a,0x9f,0xc8,0x26,0x45,0x7c,0x91,0xfa,0x24,0xc5,0x7f,0x88,0xe9,0x0f,0x74,0xa3,0xc4,0x24,0xc5,0x01,0xe3,0x3b,0x4c,0x9d,0x3b,0x31,0x50,0x9f,0x00,0xa0,0x73,0x86,0xe7,0xa9,0xf8,0x23,0x4e,0xa9,0xce,0x94,0x4c,0xc7,0x5f,0x0b,0xf2,0xd9,0x87,0x73,0x27,0xd4,0x24,0xcb,0xb7,0x63,0x0d,0x26,0xd3,0x83,0xc2,0x3b];qo = "qo=303; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>6)|((oo[qo]<
        <2)&0xff))-78)&0xff;} while(--qo>=2);"
eval(qo);qo = 302do { oo[qo] = (oo[qo] - oo[qo - 1]) & 0xff; } while (-- qo >= 3 );qo = 1for (;;) { if (qo > 302break; oo[qo] = ((((((oo[qo] + 135) & 0xff) + 21) & 0xff) << 5) & 0xff) | (((((oo[qo] + 135) & 0xff) + 21) & 0xff) >> 3); qo++;}po = ""for (qo = 1; qo < oo.length - 1; qo++) if (qo % 5) po += String.fromCharCode(oo[qo] ^ VF);eval("qo=eval;qo(po);");} 

开头是一个window.onload

window.onload() 方法用于在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻执行某个方法。

之后就是setTimeout("mq(141)", 200)

**setTimeout()**方法设置一个定时器,该定时器在定时器到期后执行一个函数或指定的一段代码

这样就是页面 加载完的 200 毫秒自动执行mq(141)这个方法

直接放到编辑器里执行后面的 js 主体打印了下结果,提示documnet未定义

不过虽然报错了,不过我们看到这里还是输出了我们要的 cookie 值_ydclearance

根据报错可以知道,这里是执行document.cookie=xxxx报错了,但是我们并不需要执行这行代码,我们只需要将他输出出来,带入到 python 中请求就可以了

所以需要把执行的代码修改成return让他返回结果就可以了

过了一遍代码发现下面这样的语句

po = ""for (qo = 1; qo < oo.length - 1; qo++) if (qo % 5) po += String.fromCharCode(oo[qo] ^ VF);eval("qo=eval;qo(po);");

可以看到po是一个空的字符串,经过po += String.fromCharCode(oo[qo] ^ VF)之后又使用eval执行了

js 中的其他 eval 都是输出的是数字,这里输出的是字符串,最符合我们上面的分析,所以我们修改这里的eval,将po返回再试试

可以看到在 js 的运行环境下已经可以正常输出需要的 cookie 了,就可以带入python中运行了

注意

这里需要注意的点是,每一次请求返回的 js 都是不一样的,所以需要使用正则匹配出js的主体动态执行生成cookie

下面是python下的运行结果

以上就是今天的全部内容了,我们下次再会~

对了,看完记得一键四连,这个对我真的很重要。
浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报