python爬虫js逆向(标准算法加密)

在爬取某些网站时,可能会遇到一些参数或头部信息进行字符串加密、数据加密或字符串编码等问题,导致不能正确获取到我们想要的数据。

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

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值