0%

第一次见到这种反爬虫。咋办?盘它。

大家好,我是四毛,欢迎大家关注我的公众号。

今天在工作中,碰到了第一次碰见的反爬虫机制,感觉很有意思,在这里记录一下,希望对大家有帮助。

今天用到的库

requests [请求] lzstring [解压数据] pyexecjs [执行 JS]

简单粗暴,直接上网站部分源代码,因为这个网站应该不太希望别人来爬,所以就不上网站了。为什么这么说,因为刚开始请求的时候,老是给我返回 GO TO HELL ,哈哈。 这个网站点击鼠标右键审查元素,查看网页源代码是无法用的,但是这个好像只能防住小白啊,简单的按 F12 审查元素,CTRL+u 直接查看源代码(谷歌浏览器)。 这次的目的主要是为了获取下面的链接(重度打码)

xxxxxxxxxxx/xxxxx-003-a5f7xxxxxx?cid=xxxxx&xxx=siOE_q4XxBtwdoXqD0xxxx

其中,红色加粗的就是我们要找的变量了。

一、观察与抓包

首先,我观察到了网页源代码中的一部分 js 代码:

type=”text/javascript”>window“\x65\x76\x61\x6c”{e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!’’.replace(/^/,String)){while(c—)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return’\\w+’};c=1;};while(c—)if(k[c])p=p.replace(new RegExp(‘\\b’+e(c)+’\\b’,’g’),k[c]);return p;}(‘29.2a({“2c”:1k,”26”:”21”,”22”:”1k.24”,”2o”:2n,”2s”:”2r”,”2l”:[“0-2f-2e.3.2”,”0-2j-2i.3.2”,”0-1r-1L.3.2”,”0-1r-1K.3.2”,”0-1e-1X.3.2”,”0-1e-1Q.3.2”,”0-1x-1W.3.2”,”0-1x-1M.3.2”,”0-1B-33.3.2”,”0-1B-36.3.2”,”0-1F-30.3.2”,”0-1F-2U.3.2”,”0-1g-2Y.3.2”,”0-1g-3e.3.2”,”0-1q-3i.3.2”,”0-1q-38.3.2”,”0-1o-37.3.2”,”0-1o-3a.3.2”,”0-1s-2B.3.2”,”0-1s-2E.3.2”,”0-1i-2v.3.2”,”0-1i-2y.3.2”,”0-1G-2P.3.2”,”0-1G-2S.3.2”,”0-1E-2R.3.2”,”0-1E-2H.3.2”,”0-1I-2L.3.2”,”0-1I-2J.3.2”,”0-t-2K.3.2”,”0-t-2G.3.2”,”0-p-2I.3.2”,”0-p-2M.3.2”,”0-o-2Q.3.2”,”0-o-2N.3.2”,”0-u-2O.3.2”,”0-u-2w.3.2”,”0-D-2x.3.2”,”0-D-2t.3.2”,”0-z-2u.3.2”,”0-z-2z.3.2”,”0-y-2D.3.2”,”0-y-2F.3.2”,”0-7-2A.3.2”,”0-7-2C.3.2”,”0-5-2T.3.2”,”0-5-3b.3.2”,”0-4-3c.3.2”,”0-4-39.3.2”,”0-g-3d.3.2”,”0-g-3h.3.2”,”0-i-3j.3.2”,”0-i-3f.3.2”,”0-b-3g.3.2”,”0-b-2X.3.2”,”0-d-2Z.3.2”,”0-d-2V.3.2”,”0-11-2W.3.2”,”0-11-34.3.2”,”0-13-35.3.2”,”0-13-31.3.2”,”0-10-32.3.2”,”0-10-1J.3.2”,”0-15-1O.3.2”,”0-15-1P.3.2”,”0-1d-1R.3.2”,……………………………………,’M4UxFsAsB9odxAIwA7WQOwObQAwCYBWXPAFlwHYBmY6ncousuvYgDlwDZ38BOT8zn3wcKARmICKOXK1qsmrFjlHdRAnKxEb1rBqK2ih5dSSbkteJXnEbpGm+SF47HLZSEElBOwRsEmlOqU3AS0JHYkWiRKJAwkYTYkQiQmIQwcShy0HDaUSpQuDJQ2HAG0BEFFWgTVQhw+3JRMOEw8Shq4PK……………………………………..GHXTzLjxjzN5CziB+3ODSAhicwuCyeBJ3YJD+eKhEi83fHm76PmK3Y/htPJFzw8LzOCqKTMcXGHr7Jm/nlPtuSUfPBAA===’‘\x73\x70\x6c\x69\x63’,0,{})) </script>

为了节省篇幅,我把一些替换成…….了。如果你对这些数据的解压有兴趣,请后台联系我。 我第一眼看见时,做了 2 件事: 1、把[\x65\x76\x61\x6c],[ \x73\x70\x6c\x69\x63],[\x7c]分别解码,解码出的结果为 eval 和 splic,| ; 注:其实这里看到 eval 时就应该想到可以试试直接用 pyexecjs 执行后面的那段 js 匿名函数,但是当时确实啥都没有想起来,很惭愧,后来复盘时才发现这一点。虽然执行了也会报错。 2、把那一长串的字母试着用 base64 解码了,但是解不出来; 然后,就只能再去其他 js 文件里找了,也找到了 js 代码,打了断点,但是看着还是很烦,于是这个时候我就没有在 js 上面死抠。 接着,我调转了方向,在 GITHUB,Google 运用了我祖传的高级搜索技巧,Finally,终于可以盘它了。

二、解密

下面开始解密: 1、数据解压 包含 A===的字符串到底时啥呢,其实这个是 js 的一种数据的压缩方式,知道了这种方式你就可以立即破解这种反爬虫机制了,反正我以前是不知道的,第一次见到,学习了。 在这里,lzstring 闪亮登场,运用这个库,执行下面的代码:

lzstring.LZString().decompressFromBase64(string)

这样就可以把上面的那串字符给解码了,解出来的数据像下面这样:

webp|png|025|024|073

没错,数据解压就是这么的简单; 2、看懂 JS 我们在上面解码出来了一个 splic 和一个[ | ],再看看我们上面解压出来的数据,是不是很有感觉;但是,查了好一会资料,也没有发现 js 里面有这个方法,可能是在别的地方定义了;在我找到的资料里面,那个作者是直接用了 split,最后的结果是对的,走逻辑上也说得过去,不知道为什么这么设置成 splic,还希望有大神可以指教; 3、执行 JS 所以,到这里就很明显了,把解码以后以及解压以后的数据在替换会原 js 数据中,我们前面解码出来的 eval 就有用了,我找到的资料里面作者使用 node 做的,我没有安装 node 环境,所以我就直接用了 pyexecjs.eval 直接执行了,结果也正确; 4、梳理流程: 匹配长字符串==>lzstring 解压+解码后的字段==>拼凑成新的 js 代码==>pyexecjs 执行==>出结果 5、部分代码 执行的主要步骤和结果

execjs.eval(res)

没错,就是这么简单,res 就是替换后的 js,然后就可以直接出来我们上面网址中需要的两个字段了。 截个图吧

三、结语

到这里,今天的文章就结束了,总结一下就是知道了一种 JS 数据的压缩方式,并且学习了解压的方式,JS 的执行,同时写代码的时候**多观察,多想,多试**。 如果觉得还不错,欢迎动动手指关注我。