Python 爬虫进阶必备 | 某采购网站 cookie 加密分析(仿加速乐)
今日网站
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 = 302; do { oo[qo] = (oo[qo] - oo[qo - 1]) & 0xff; } while (-- qo >= 3 );qo = 1; for (;;) { if (qo > 302) break; 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
下的运行结果
以上就是今天的全部内容了,我们下次再会~
- 点赞
- 收藏
- 关注作者
评论(0)