admin管理员组文章数量:1650964
事件背景
前不久我写了一个按歌手爬取酷狗音乐所有歌曲的爬虫,然后在昨天2019年5月10日使用的时候出现了错误,排查问题后发现是获取歌曲相关信息的那个接口做了修改,导致我原有的爬虫失效。在测试后发现,在原有的基础上需要携带Cookie里面的kg_mid
参数才能正常获取,然后我去浏览器里面查看页面刷新出来的请求,发现kg_mid
参数是浏览器生成的而不是服务器返回的,所以就开始了逆向前端JS的过程。
逆向过程
-
首先我查看了所有的请求,然后筛选后只保留了获取JS文件的请求,确定具体是哪个文件最死板的方法是一个个打开然后去查有没有
kg_mid
这个参数的相关生成方法,但是这里我们根据JS文件的名字推测出应该是我标记的这个kguser_min.js
文件,因为Cookie就是相当于用户的身份,所以根据user能推测出是这个文件,事实上也确实是在这个JS文件里面,所以有时候合理的推测是可以大大减小我们的工作量的。
-
将这个JS文件下载下来用编辑工具打开,这里我用的是Notepad打开的
-
但是打开后发现格式并没有对其,代码挨在一起阅读比较困难,所以我们把里面的JS代码剪切出来,找一个JS格式化的工具把它格式化后在粘贴回去。
-
在线工具网站:JS/HTML格式化
-
格式化后的效果图
-
接下来是重点了,文件内按CTRL+F查找
kg_mid
,定位到的位置代码作用是设置KgMid
的name属性的值为kg_mid
,所以下一步我们要查的是KgMid
-
查到的第一个位置,代码作用大概是读取Cookie里面的
kg_mid
对应的值,但是读取不是写入,跟我们的目的不符,虽然看这些代码能让我们了解酷狗的运作过程
-
因为这个匹配的位置有点多,所以我就不一一叙述了,直接找到我们发现将
kg_mid
写入Cookie的代码 -
定位到位置,判断依据是KgUser.Cookie.write方法,这个Cookie.write方法是用来写入Cookie的。这里的相关代码作用大概是读取Cookie里面的
kg_mid
对应的值,判断是否有值,如果没有,则将kg_mid
写入Cookie
-
而我们的注意力就要放到下面这两句代码上面,我们来分析它们
var n = KgUser.Guid(); KgUser.Cookie.write(KgUser.KgMid.name, KgUser.Md5(n), KgUser.KgMid.days * 86400, "/",KgUser.GetDomain());
-
Guid()
方法很明显是按照一定规则返回一个生成的参数,并传给下面的Md5()
方法 -
然后再看Cookie.write这个方法,这里面重要的两个参数是name、value,对应的就是
KgUser.KgMid.name
和KgUser.Md5(n)
-
所以我们实际只需要模拟函数
Guid()
和Md5()
,首先找到Guid()
的位置
-
利用工具调试这段代码后发现,
S4()
作用是生成一个四个随机字符拼接成的字符串,这个字符要求属于a-z 0-9
的范围
-
然后Python模拟这个方法可以用下述代码代替
import random #随机生成4位随机的字符列表 范围为a-z 0-9 n=random.sample('abcdefghijklmnopqrstuvwxyz0123456789',4) #将列表元素拼接为字符串 n=''.join(n)
-
然后找到
Md5()
的位置
-
这个部分代码比较多,所以我本来第一想法是交给JS引擎处理,相当于Python调用JS,然后将返回结果传给爬虫,但是最后发现这一部分代码其实就是MD5加密算法的JS实现,而刚开始我以为是酷狗特有的(在MD5通用加密算法的基础上修改具体参数)
-
这部分如果用JS引擎处理的话需要用到一个Python的第三方库execjs,相关使用可参看:
Python如何执行JS代码 -
但是这里我着重讲的是用另一种方法调用Python的
hashlib
这个第三方库,用它来实现Md5加密 -
hashlib
库的安装,打开CMD控制台,输入:pip install hashlib
来安装 -
然后完整的生成
kg_mid
参数的PYTHON代码如下:# -*- coding: utf-8 -*- """ @author: CoderYYN @Email: coderyyn@qq.com
逆向n酷狗js加密方法 MD5 加密参数 Cookie里面的kg_mid
“”"
import hashlib
import random
#创建md5对象
md5= hashlib.md5()
#随机生成4位随机的字符列表 范围为a-z 0-9
n=random.sample('abcdefghijklmnopqrstuvwxyz0123456789',4)
#将列表元素拼接为字符串
n=''.join(n)
#将字符串编码后更新到md5对象里面
md5.update(n.encode())
#调用hexdigest获取加密后的返回值
result=md5.hexdigest()
print(result)
```
- 运行结果
总结
JS的破解其实就是去JS里面找到反爬虫设置的手段,只要读懂了JS的意思,并且能灵活运用Python实现,就能达到以假乱真的地步。
其实对于有基础的同学来说,JS很好读懂,对于没见过的函数和方法,不用迷茫,网上查找相关资料就好了,毕竟这些都是API,不需要背下来。
相关文章
- Windows10下安装Anaconda3(64位)详细过程
- 强力推荐的文本编辑器 Notepad
- Python如何执行JS代码
我的个人博客网站是:www.coderyyn
上面会不定期分享有关爬虫、算法、环境搭建以及有趣的帖子
欢迎大家一起交流学习
转载请注明
版权声明:本文标题:酷狗音乐网站前端JS的逆向过程 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1729549084a1206000.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论