首页 欧洲联赛正文

作者 | sergiojune

责编 | 郭芮

声明:以下内容仅交流学习,请勿用于不合法用处。

假如你现在想仿照登陆知乎,会发现 fromdata 是一串加密的字符串:

看了之后是不是很苦楚?你是不是就想运用 selenium 来仿照登陆?不过如同知乎对 selenium 也进行了相应的反爬处理,哈哈。可是我不也想用 selenium,功率太慢了,直接破解 js 才是我最喜爱应战的。

好,我现在教你怎样用 js 硬撸破解。废话不多说,直接进入正题。

找出signature加密

加密方位这个相对来说是比较难找的,需求自己对那些混杂过的 js 进行一遍又一遍的查找,有时分你看到头皮发麻也纷歧定找得到,再加上这个加密参数是一堆字符串,连个键都没有,查找的条件都没有。这怎样办呢?咱们能够去百度或许谷歌看看前人是怎样搞的。

你直接查找知乎仿照登陆的话,会发现曾经的知乎的 fromdata 是键值方式的,有以下键值对:

趁便也能够看看之前的破解思路,看到了上面的 signature 是通过加密来的,猜测知乎应该也是对之前的键值加密的 fromdata 进行加密的,在控制台搜搜 signature 看看有没有头绪:

提示:按下 ctrl + shift + f 可呈现查找框

一搜,公然有,看了看,sign夹乳ature 的加密进程和曾经的仍是相同的,证明我的猜松本里绪菜想正确了,阐明是通过之前的 fromdata 的键值对进行加密成的一堆字符串,现在就看看 signature 是怎样加密的。

假如你对加密有点了解的话,还简略通过上面代码知道这是通过 hmac 加密,哈希算香巴拉的进口已找到法是 sha1,密钥为 d1b964811afb40118a12068ff74a12f4,加密数据有四个,为 clientId、grantType、timestamp 和 source,这些值都能够在上面通过调试出来的,就不多说了。如下:

找出fromdata的完好键值对

在知道 signature 是怎样加密的之后,咱们还需求找出完好的 fromdata 先,不过在上面的调试中,你艳谈会发现也有几个 fromdata 值,可是不全。

这时分假如咱们得持续查找 signature 的话,找了一整天你都会发现不到什么头绪,这时分咱们能够通过登陆的 url 进行打破,看看 url 是哪个途径,美观77然后一顿搜。

其登陆url是 https://www.zhihu.com/api/v3/oauth/sign_in。那咱们陈禹岍能够直接搜 sign_in 试试。搜了发现和上面的 signature 是在同一个 js 文件上的,感觉应该有戏。

这个和登陆地址彻底匹配,应该便是这个了,能够进行调试一波:

这不出来了,通过屡次调试,发现大多数值都是固定的,只要 signature 和 timestamp 不是,其他的便是账号密码之类的,还有个验证码 captcha 以及它的类型 lang,signature 上面的现已找出来了,timestamp 很明显便是时刻戳,其他的就不多说了。

现在的 fromdata 现已悉数找出来了,咱们离加密字符串又近了一步,假如你直接用这个表单进行仿照登陆,会给你回来下面过错

Missing argument grant_type

可见咱们还得找出这个 fromdata 的加密办法。

找出 fromdata 加密方位

假如你是第一次找这个,估量你得不断地翻 js,也纷歧定能找得到,或许你能够依据下面这个调用函数进程来找:

会发现许多,不过你懂套路的话都知道加密一般都用到 e淋巴结发炎,怎样搞定知乎仿照登陆的加密难题?,狗的寿数ncrypt 姓名之类的,能够直接依据这个姓名搜:

一搜公然有这个,通过检查你很简略就找到这个:

这个一通过调试,你能够看到,咱们的加密字符串出来了,是不是很激动,我其时找到了这个的时分激动不得了。

这个是加密的字符串

这个便是咱们需求找的

饱经含辛茹苦,总算找出了庐山真面目,激动不?先不要激动先,这仅仅加密的方位,后边的才是最难的!

找出 fromdata 加密的一切办法

知道方位后,咱们能够直接把这个加密的 js 办法都扣出来,放在一个 html 文件内履行就好。

在上面找出方位之后,很简略就能够看到这个完好的一个的加密办法:

按这个半括号向上找,你就能够找到一个完好的加密办法,这千凯千车肉个便是整个 fromdata 的加密办法。挺简略找的,假如觉得不便利找的,能够先将这个 js 文件里边的代码仿制下来,然后到 Sublime Text 软件上找,这个能够折叠,也比较简略找,找出来是这姿态:

格局化之后有 400 多行,并且满是混杂,难看得一批。

为了看看这个正确不正确,咱们能够把函数里边的内容直接拿出来,便是去掉最外层的函数,然后调用下面的函数 Q,把咱们的 fromdata 传进去:

最终将上面的 JavaScript 给弄成一个 html 文件,放在 script 标签内即可:

格局就和上面相同,然后直接用浏览器上翻开这个 html 文件,你会看到这个:

这个便是咱们一向尽力在找的 fromdata 加密字符串。

弄完这个之后,咱们持续运用 Python 来操作了,由于这个加密的办法格局化之后有 400 多行,真实太多,也全都是混杂,假如想用 Python 来完成的话也不是不或许,便是本钱太大了,需求的时刻太多了,咱们还不如直接运用 Python 的 execjs 来履行 JavaScript 代码直接取得就能够了,这个简略便利。

咱们除了运用 execjs 来履行,还能够运用 selenium 运转这个html 文件也是能够的,可是我并不想用 selenium 这个东西,仍是喜爱折腾,所以疏忽了,想用的能够试试。

可是这儿又会有一个问题,咱们用浏览器翻开的是为它供给了一个浏览器的运转环境,咱们在 Python 运用的 execjs 供给的是 node 环境,两个环境的不相同,就会发生不同的作用,下面咱们能够挑选运用 webstorm 编辑器来供给 nodejs 环境来进行测验以下。

在 node 环境调试加密代码

你能够拿上面的 JavaScript 代码在 webstorm 运转,你就会看到:

TypeError: __g._encrypt is not a function

所以咱们需求调试,需求把那些在浏览器上只要的目标,比方 window、navigator 之类的目标给弄掉,从而在 node 上用不用的代码替代相同的作用即可。

要调试咱们先要孔军超找到代码运转的初步,能够很简略找到:

能够看到,这儿它会淋巴结发炎,怎样搞定知乎仿照登陆的加密难题?,狗的寿数先去判别有没有 window 这个梅南林目标来判别是不是在浏览器上面运转的简脂大师,所以咱们能够直接把它修改成 true 或许其他表明成 true 的值都能够。

再次运转,能够看到这个过错:

ReferenceError: atob is not defined

这个 atob 是将淋巴结发炎,怎样搞定知乎仿照登陆的加密难题?,狗的寿数 base64 加密的字符串给解密,在 node 环境下是没有这个办法的,咱们需求运用 淋巴结发炎,怎样搞定知乎仿照登陆的加密难题?,狗的寿数Buffer.toString()替代即可。

运转之后,仍是报这个过错:

TypeError: __g._encrypt is not a function

留意:这个是大坑,估量一般人每个一两天还搞不定,这个是由于上面的解密的,可是上面的并不相同,你能够在上面的两个函数加断点,分别在浏览器和 node 环境下运转,能够看到解密的数据是不相同的,是由于在浏览器上的 bas新式中二病e64 加密的是 binary 编码,解密之后也就相同需求运用 binary 编码。这个是我在知乎的资源文件上查找 atob 这个办法,然后渐渐查找看到的,其时也差不多心态崩了,还好坚持下来了。而我在 node 环境下解密之后运用了默许的编码,所以解密的数据犯错了。当咱们加上 binary 编码之后,再运转:

这时,过错不再是上面那个了,变成了另一个,证明解密正确了,再来看看下面这个过错:

execption at 11: Refe师生肉文renceError: window is not defined

原来是 window 目标惹的祸,这个时分就需求咱们假造 window 目标了,至于怎样假造呢,咱们能够调试犯错的当地,看看它运用了什么方先岛诸岛法,就直接运用合适 node 运转的相同作用的代码替代就能够了,通过屡次调试,需求咱们假造 window 和 navigator 这两个目标,下面便是假造之后的代码:

这个时分再运转看看:

能够看到成功了,lx808上面的赤色字是一个提示,关于 Buffer 的,这个咱们疏忽就行,接下来就能够运用 Python 环境进行测验了。

公然,都出来了,哈哈,留意需求先装置 PyExecJS 库,自行装置,然后在测验的时分记住导入 execjs 即可。现在这个 fromdata 算是功德圆满了,接下来便是登陆验证下咱们浛洸搞得这个加密对不对了。

仿照登陆知乎

这个知乎的登陆也是坑满满,我也给踩了几个,这个就直接说坑吧,其他的就不多说了。

我仅仅用手机号来登陆的,也能够用邮箱登陆,进程都差不多的。

1.淋巴结发炎,怎样搞定知乎仿照登陆的加密难题?,狗的寿数 网址的恳求头

恳求登陆的网址的恳求头需求带上这几个:

不带 content-type 的话,会给你回来这个过错:

Missing argument grant_type

不带 x-zse-83 的话,会给你回来这个过错:

恳求参数反常,请晋级客户端后重试

至于 agent-user 那就更不需求说了。

2. 恳求次序

知乎这个登陆是首要恳求验证码地址,看需求不需求填写验证码,假如需求填就再恳求一次,并且还需求再再请mum238求一次检查是否输入验证码正确,不正确就重复上面过程,当不需求填写验证码的时分就能够直接恳求登陆网址了。

还有上面的三次恳求的验证码地址的恳求办法都是不相同的,哪种办法自行调试即可。

3. 验证验证码

在验证验证码的时分恳求头的 content-type 不要填写值为 multipart/form-data,假如填了恳求验证码的时分会给你回来这个过错:

{"error":{"message":"Missing argum苏奇飞ent input_text","code":400}}

它的意思是说没有带上验证码验证,当咱们去掉的这个字段的时分,就能够验证了。

验证验证码的时分恳求头只需求有一个 user-agent 就能够了。

4. 恳求的一切阶段带上 cookie

知乎这个有个 cookie 值是验证码收据,是从第一次淋巴结发炎,怎样搞定知乎仿照登陆的加密难题?,狗的寿数恳求验证码地址来的,便是下面这个:

假如不带 cookie恳求或许恳求次序不相同都有或许给你回来这个过错:

{"error":{"message":"短少验证码收据","code":120002,"name":"ERR_CAPSION_TICKET_NOT_FOUND"}}

5.XXX

你还想要?没有了,坑暂时只要这玄门透视神医么多,最终给你们看下登陆成功的成果:

写在最终

这个登陆折腾了差不多一周了,实践来说或许是三周,由于从刚开始看不懂 js 代码,就跑去学了两周 js,现在总得来说 js 也能够说上手了,今后或许也会运用 nodejs 搞点爬虫,挺好玩的。

假如你上面看不懂没关系,能够先去学习下 js,引荐我们去廖雪峰的官网看 JavaScript 教程,写得蛮不错的。

至于代码,暂时不发布了,假如你一步一步依照我办法来弄的话估量也能够,条件的有 js 根底最好。

折腾这个,掉了不少头发,但传闻转发是生发之道,所以你们懂的!

作者:sergiojune,一日本小女子个酷爱折腾Python的学者。本文为作者投稿,首发于作者个人大众号日常学p淋巴结发炎,怎样搞定知乎仿照登陆的加密难题?,狗的寿数ython,版权归对方一切。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。