赞
踩
如今的各大网站/APP都带有了身份验证/滑块/cookie/访问参数来限制爬虫,做好了许多的反爬措施,因此爬虫如果想继续下去,就必须考虑到
1、挨批反反爬(这是因为同一个挨批访问过多会被暂时限制访问,够麦搞你名挨批,随到挨批)
2、JS逆向处理,这点需要具备JS语言,不说熟练,精通。只要能看懂每个代码块是负责什么,执行什么功能即可。
3、...........细节,细节,还是细节,因为JS逆向工程本身就是一个非常枯燥无味,且考验眼力的活,扣代码,还原加密过程。一步错就会导致加密参数的不正确性。请求就会被回拒。
4、没4,屁话少说,开始介绍
:测试网站
我们打开网页,他的要求是让我们求出1-5页的所有机票价格平均值,这里有一个小细节,就是当我们点击换页的时候并不会改变它的URL,
打开网络控制台,抓取一下包,查看一下数据包的参数,以及返回出来的数据是放在哪一个包里面,这时候我们会遇到第一个问题就是无限Debugger,这里只需要在断点处右键从不在此处停留就好
在network面板中随意搜索一个价格,定位到包的位置,然后可以看到,这是一个以json数据返回的,并且在负载中能够看到,携带了一个加密参数M,结构类似于md5加密 | 一个时间戳(这里有一个坑点,|这个符号不是英文的,而是中文,因此如果这个找错的话就搜索不到相对应的数据包了,只能用堆栈查找)(md5的结构常为16/32/40 0-9 a-f),接触密文多了后常见的几种就能够大致分辨出来,会减少很多时间
第二步:加密还原
当我们找到了他的携带加密的参数后,点击右边的initial,这是事件触发堆栈,点进去,找到requests,(点击requests是因为这是产生加密参数发送到服务器时处理的包,这篇案例中就是由他来处理参数)
点击requests进去看看请求的包里面有什么内容,进去之后发现是通过混淆了的
,我们复制到pycharm里面将其内容打印出来
这时候我们就能够得到了基本像样的数据结构了,打开webstorm,创建一个JS文件,我们现在得到的数据就是一个大致的加密骨架,点击运行,查参数补参数
附:date[‘parse’],为时间戳,new date为最新的时间,我们将算数解出来后用结果替代,最后,只剩下oo000和window[‘f’],再次寻找oo000,查看其函数结果为多少
再次创建一个JS文件,这个JS文件是用来装oo000这个函数的,从大骨架的文件中我们能看到有个oo000函数+windwos.f,这就是我们要解决的问题
第三步:扣代码环节
把刚才的oo00函数放入到fiddler的js调试工具中格式化代码块,再次放入webstorm内,最后,删除不要的部分,运行,补参数
少谁我们就去浏览器中搜出来,补上谁
以此类推,直到把oo000函数要用到的参数补全就好,但是这个windows是个数据对象,我们定义i个空的就好 ,然后又发现一个更加坑的点位,这个oo000函数全部解决完后你会发现这玩意就是个空的,啥也没有,m参数原先是oo000+window.f,这时候由于oo000是空,因此window.f就是我们的m参数
接着找win.f,在控制台输出一下window.f,发现是一个md5加密的字符串,我们打上断点后,在搜索框内搜索看看是否能找到md5有关词
点击进去,把没用的代码删了,找到md5加密复制放到ws里,再根据主成结构还原整个构造,创建get_m文件,这个get_m就是我们需要的m参数,记住” | ”这个参数需要复制原先的,如果你的电脑不能打出这个符号的话.
再次点击运行,多次运行查看一下这个m值是否随着时间来改变,如果每次的结果都不一样,说明那就是完成了
如图所示,我们的get_m函数里面按照原骨架的结构重写了一份,这个就是m值,切每一次运行结果都会随时间的改变而变化
打开pycharm,这时候新建一个js文件,将刚才的get_m代码块全部复制进来,然后在重建一份py爬虫文件开始执行,但是在此之前你需要安装号execjs,这是python执行js命令的库,否则的话他将会报错:No model named 'execjs'
- import requests
- import execjs
- from headers import headers
-
- def get_m():
- node=execjs.get()
- ctx=node.compile(open('./get_m.js',encoding='utf-8').read())#打开JS文件
- m=ctx.eval('get_m()')##这里的eval代表需要执行的js语言
- return m
-
- def send(page):
- params={
- "page":page,##携带页数
- "m":get_m()
- }
- res=requests.get(url='https://match.yuanrenxue.cn/api/match/1',headers=headers,params=params,verify=False)
- return [data['value'] for data in res.json()['data']]
-
-
- def start():
- ls=[]
- for i in range(1,6):
- ls.extend(send(i))
- print("平均数为"+str(sum(ls)/len(ls))+"元")
-
-
- if __name__ == '__main__':
- start()
至此,到这一步我们的任务也就完成了,其实第一题还是很简单的,只是单纯的抠一下代码而已,要找到具体加密的位置,还有就是需要知道这个加密位置是在哪,是发送前加密还是发送后返回前的加密
在JS逆向过程中我们需要掌握的技能就是需要学会辨别加密方式
例如非对称加密大部分都是用:MD5(md2/md4)/sha1/sha256/sha512
这里的非对称加密其实就是代码内取烟校验,是不可逆的,只能重新还原代码了,重要的是学会如何辨别
md5 16/32/40位,他们的架构都是0-9 and a-f
而sha1/sha256/sha512:则分别问40/64/128位,结构其实和md5差不多,只是长短不一,还是容易区分。
其次最重要的一点就是base64,这个不属于加密,只是编码形式的一种而已,他是由:A-Z a-z 0-9 + _ ==构成,如果密文长度达到了4的倍数,则不需要=补充,否则你将会遇到=。
混淆加强:
此外我们还需要了解以下几种混淆,大家有时间可以常逛论坛了解
AA混淆
exal 混淆
JJ混淆
JSfuck
ob混淆
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。