js 获得明天0点时间戳_爬虫实例(四)某不知名网站的js反爬

目标网站:

http://www.pbc.gov.cn/jinrongwendingju/146766/index.html​www.pbc.gov.cn

chrome走起,进入目标网站后ctrl+U,发现好像没有反爬?requests试一下

import 

OK,走你~

13823a726f4d05c9b1f727ee91c9cd2e.png

一堆混淆过的js?

打开fiddler,刷新下目标网站。

91511e5785c502f5dcb5b48cea4923d2.png

然后发现,#1的请求返回的就是混淆过的js,然后网页进入了#2的url,#2又302重定向回了原目标网站,对比一下#1和#3两个请求,我们发现cookie变了,这时我们随便点进入一个新闻,观察fiddler的抓包情况,发现已经可以正常获得页面了,而新闻页面和#3的cookie是一样的。思路这时候就有了,读js,找到#2的url,重定向到#3后获取cookie或者直接session。

下一步读js,chrome在目标页面F12进入开发者选项,F1禁用js,刷新页面

fc733ad2bdeb93a8f1eed42df0d5e174.png

1e4b41581f6462d165529833c3830d99.png

什么破玩意儿咱先不管,ctrl+U看看源码。

f64ee8e2d1ca48a5839a02d47f26b08d.png

好吧,脑壳疼,简单的反混淆吧,找个网站把这段代码格式化,再把eval语句变成正常人读的语句,然后就变成了这样。

35941250d17a117e7affc6066d53d1e9.png

然后把这些_0x3fb5e之类的破变量也变成人读的。

import re

# 读取js网页
with open('test.html', 'r') as f:
    html = f.read()

# 把不是人看的变量名换成是人看的
real_name = iter('a' + str(i) for i in range(5000))
faker_name = set(re.findall(r'_0xw{4,6}', html))
print(faker_name)
for i in faker_name:
    html = html.replace(i, real_name.__next__())

# 重新写入
with open('test.html', 'w') as f:
    f.write(html)

47581e933a1b635321d52921b8211373.png

好了,开始分析代码。

我们直接用ide把一些函数定义语句折叠方便阅读,就变成了这样子。

01d814871314d50170a7906237d4b451.png

逻辑一目了然,定义了一堆字符串,一个长数组,还有几个函数,执行了funtion(a30, a136)(_a96, 0x123)这个函数,执行了a21(),然后一个if语句,js代码结束。

读完逻辑边调试边读详细代码,这里直接用chrome调试。

先把变量和函数定义好。

82788462960f8fb975d1849999611ef8.png
定义变量

dcbe67dcd3841ee6fe8d9a5f7301cb3f.png
定义函数

定义完开始读代码。

b4213be0ce67cd6bb37624af2c2dcfa3.png

可以看到,这个函数就是把_a96的数组push+shift了几百次。

ce95f23d5f2a0ea873a3a2590e0742da.png

接下来就执行了a21(),我们来看看a21。

c1418a895bd99a779c344ac8423741e0.png

定义了个哈希表a120,key是字符串value是函数。

然后a15这里调用了a120里的元素a92('0x36', 'jo5I'),前面说了a120是个哈希表,那a92返回值应该就是其中的value,我们直接调用a92('0x36', 'jo5I')

d5bbdd612bf24b19b30453ff612f4348.png

可以看到,hwQpj确实是a120的一个key值,我们把a92函数都直接用结果替换,a21就变成了这样。

d9d2a18e16ea165fc73b0a10ddd98f14.png

接下来

7b85e142cfdfe35282c66d7a2c1775bb.png

c66ba1d23db00de6803d54e615120f77.png

接下来

c47e828491835e334687f73c8c86fd93.png

c0a71978fd93ddcaaf494ef390784e99.png

也就是说,a104就是最后的地址。

对了,a21()调用后还有一句:

5103a523ddcfd87dcaaace69b9348ccc.png

翻译后:

64d0855457f5656aa18b845776fa63ca.png

就是提供加密的人的一个验证,让用了他的加密的开发者不能删除自己留的字符串,并不影响我们的反反爬。

也就是说,获得a104就能成功反反爬。ok,代码走起~

import 

a717530eb9518cbd7451399b88139708.png

ok,结果get~

END!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值