当前位置:   article > 正文

猿人学——web/js 逆向爬虫打卡(第一天)_猿人学爬虫逆向

猿人学爬虫逆向

一、文章前述:

             如今的各大网站/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'

No module named 'execjs' 

  1. import requests
  2. import execjs
  3. from headers import headers
  4. def get_m():
  5. node=execjs.get()
  6. ctx=node.compile(open('./get_m.js',encoding='utf-8').read())#打开JS文件
  7. m=ctx.eval('get_m()')##这里的eval代表需要执行的js语言
  8. return m
  9. def send(page):
  10. params={
  11. "page":page,##携带页数
  12. "m":get_m()
  13. }
  14. res=requests.get(url='https://match.yuanrenxue.cn/api/match/1',headers=headers,params=params,verify=False)
  15. return [data['value'] for data in res.json()['data']]
  16. def start():
  17. ls=[]
  18. for i in range(1,6):
  19. ls.extend(send(i))
  20. print("平均数为"+str(sum(ls)/len(ls))+"元")
  21. if __name__ == '__main__':
  22. 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混淆

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/709414
推荐阅读
相关标签
  

闽ICP备14008679号