在爬取某些网站时,可能会遇到一些参数或头部信息进行字符串加密、数据加密或字符串编码等问题,导致不能正确获取到我们想要的数据。
step1 观察是否有加密
通过正常方法请求网页,并且也加了请求头和请求参数伪装浏览器,发现返回的状态码还是4xx,那么就要考虑到是否是请求头或者请求载荷中有数据进行了加密!!!
下拉网页之前,先在“网络”中清空所有数据包,再停用缓存,筛选出Fetch/XHR类型的包。下拉完网页(或者重新点击某选项)后,出现红框总的数据包。
首先点开数据包,查看请求标头和请求载荷是否有加密数据,发现请求头中的U-Sign是加密数据
step2 由关键词找加密函数
直接对加密的关键词进行搜索,很显然,搜到的部分都是抓到包的请求头的一部分,并没有进入到源代码中,所以失败。如果太多或者没有搜索到,就可以直接跨越到下一个步骤。
step3 XHR断点跟栈
这个时候复制请求网址的路径(域名之后的部分),将其加入到XHR断点(源代码界面的右边选项)中去,然后再下拉页面(或点击选项)即可进入断点
每一次打XHR断点调试进入的地方基本上都是send()、apply()等XML对象处。
接下来就是要“跟栈”找到关键词u-sign,此时关注“调用堆栈”和“作用域”两个部分,在“调用堆栈”的列表中,我们可以由上至下依次溯源(程序的执行是用下边的结果执行上面的内容),更改堆栈的同时,观察“作用域”中的“本地”参数是否生成关键字
果然,在追溯到第二个栈的时候,出现了关键字,这时候就需要继续往“下”(回)追溯
往下继续点击栈的时候,异步下边都无变化且蓝色光标也不移动。这是因为到了异步栈(此时外表事件都是一致的,但是事件内部行为有很多),所以要在源代码处打断点进入行为(一定要先把之前的XHR断点取消掉)
小知识点:promise异步栈对象中存在request拦截器(前部分方法)与response拦截器(后部分方法),如果此时的“作用域”中headers没有生成u-sign,那么它就是在request拦截器中生成
根据上述图片很显然此时u-sign是request拦截器中生成的,所以点击上图链接
接着就能找到生成关键字的方法:(但这里不一定是加密函数,要点进去看详情)
此时把生成方法放入控制台输出看一下,是否是我们想要得到的加密内容 (注意:控制台输出之前,一定要打上断点进入调试状态,最好先取消到之前的其他断点)
一般来说,加密函数在哪呢?
答:一般找到一个方法或者函数的return后面的位置
点击进入o的定义位置,如下图,一看最后两行就是加密函数的操作,控制台输出一下(同上,进入调试状态)
看了一下最终加密的长度,怀疑是标准算法md5
什么是标准加密算法?
答:加密前的内容一致时,加密后的结果一定相同!
md5在线加密网站输入加密,发现真的是md5加密(对照加密后的字符串和前面网页控制台的n(o)后的字符串是否一样)。可以看出n()函数是MD5加密函数,o则是其中的待加密字符串(仔细观察发现是数据包中的请求载荷的参数)
小知识点:常见的标准算法md5(32位)、sha1(40位)
这种找标准算法的方法属于投机取巧了,有些并不是标准算法,而是js混淆,那么这个时候就需要另一种方法(补代码)!!!
打开pycharm,编写js代码,其中json_data是请求载荷的参数
const CryptoJs=require('crypto-js');
function my_main(a){
i = "9SASji5OWnG41iRKiSvTJHlXHmRySRp1"
o = Object.keys(a).length > 0 ? "".concat(JSON.stringify(a), "&").concat(i) : "&".concat(i);
o = o.toLowerCase()
u_sign=CryptoJs.MD5(o).toString()
return u_sign
}
json_data={
xx:xx,
yy:zz,
}
console.log(my_main(json_data))
如何在python文件中引用js文件?
import execjs
u_sign=execjs.compile(open('xxx.js','r',encoding='utf-8').read()).call('my_main',json_data)
我的pycharm是社区版的,所以安装不了js插件,只能用命令行的方式来运行js文件(但是要先安装nodejs,并且配置好环境)
结果与u-sign一致哦!
step4 从堆栈找入口
第三步成功的话,并不需要看这个。前面找不到的话,直接从启动器的堆栈入口进入,任选一个都行
然后直接ctrl+F直接查找关键词,剩余步骤同上
step5 测试加密函数是否正确
对照载荷中u-sign的值是否与自己找到的加密函数的加密结果一致!!!
总结:
js逆向是真的变化多端,不同的网页有不同的操作技巧。但是如何打断点进行调试是一个需要花费时间掌握的内容,现在对于基本的加密算法能够从网页源码中找出,加密,将js引用到python中。存在疑问:什么是异步栈?什么是js混淆?标准算法的加密解密?
学习参考视频:JS逆向封神路!爬虫大佬必修课,2024年Python爬虫进阶教程,企业级逆向实战(逆向各种参数、验证码、滑块、算法)学爬虫看着一套就够了_哔哩哔哩_bilibili
标签:加密,请求,python,爬虫,sign,js,断点,函数 From: https://blog.csdn.net/benbenxinchen/article/details/139131162