web爬虫第五弹 - JS逆向入门(猿人学第一题)

这篇具有很好参考价值的文章主要介绍了web爬虫第五弹 - JS逆向入门(猿人学第一题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0- 前言

爬虫是一门需要实战的学问。 而对于初学者来说,要想学好反爬,js逆向则是敲门砖。今天给大家带来一个js逆向入门实例,接下来我们一步一步来感受下入门的逆向是什么样的。该案例选自猿人学练习题。猿人学第一题

1- 拿到需求

进入页面拿到需求我们先不要急着看源码, 没事多点点喝杯茶。需求为抓取页面上所有机票的平均值。

2- 参数分析

1- 打开无痕浏览器, 免得上班刷题被网管查到记录。 然后可以放心的多一点看一web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
前三页都挺正常的, 看起来就是普普通通的AJAX请求
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
2- 第四页第五页画风突变,不让看了。一想也是, 防止你手动计算, 只能逆了js才能访问。 好吧, 我们现在来构建一下请求。
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python

3- 复制请求到postman, 可以正常访问。
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
将代码复制到python, 亦可以正常访问。 哇, 感觉还行啊
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
再运行一下, 报错了, 看下postman, 也报错了。 看样子是有时效性的参数。 那我们来看看参数吧。
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
就是这个了, 多抓几次包, 确定page是页数,还有一个m是变动的。 瞅着后面像是个时间戳。前面是一段类似加密参数。 那我们的目标明确了, 就是这个m。 破解了, 就可以正常获取到页面了吧。
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python

3- 逆向过程

1- 首先我们要知道一个参数如何加密的,需要先找到加密代码。 以下提供两个方法:
方法一:从Initiator中进入
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
最后一个请求在此发出。 我们在此处打上断点, 即为发送请求时所有参数在此以全部加载完。那我们重新请求, 既可以看到参数的变化,从call stack中寻找, 或者search中搜索关键词都行。 慢慢找到参数 m 的生成地方
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
最终我们在request中找到了m的生成地方, 查看m参数是如何生成的
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
我们看到参数m 是有 window[‘\x66’] 这个值生成。很明显这个js文件中并没有该值的生成逻辑。 那如何找到 window[‘\x66’] 的加载地方呢。 我们继续往上一个堆栈找, 即anonymous。
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
进入后我们发现这里有一大段未格式化的js代码。 写的不规范,十有八九就是不想让你看。 如果一个网站js代码不想让别人读,那它一定有问题, 我们把这段代码拿出来格式化一下
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
去掉一些没有什么卵用的东西, 剩下了两段js代码。
一段是我们在上一个js中看到的oo0O0(mw)函数,
另一段是window的相关属性。

web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
咱们都展开看一下,运行一下, 发现报错。 缺少w函数, 我们缺啥补啥,一个个给他找齐

D:\Scriptspace\逆向\学习逆向第一步\猿人学_第一题\第一段js.js:1
w();
^

web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
只用补齐w() 和 D()两个函数, 再次运行即正常了, 我们拿到参数 mw, 传入oo0O0(mw) 试试效果

web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
结果如下, 又去少了window.a, 继续补, 补到运行不报错为止。
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
参数全部补齐后, 又报了一个如下错误。
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python

node:buffer:1349
throw lazyDOMException(‘Invalid character’, ‘InvalidCharacterError’);
^
DOMException [InvalidCharacterError]: Invalid character
at new DOMException (node:internal/per_context/domexception:53:5)
at _node_internal (node:internal/util:520:10)
at atob (node:buffer:1349:13)
at oo0O0 (D:\Scriptspace\逆向\学习逆向第一步\猿人学_第一题\第一段js.js:52:10)
at Object. (D:\Scriptspace\逆向\学习逆向第一步\猿人学_第一题\第一段js.js:57:13)
at Module._compile (node:internal/modules/cjs/loader:1254:14)
at Module._extensions…js (node:internal/modules/cjs/loader:1308:10)
at Module.load (node:internal/modules/cjs/loader:1117:32)
at Module._load (node:internal/modules/cjs/loader:958:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)

没办法一个个去打印查看一下,并随手chatgpt一下, 经过gpt的解析, 代码应该是如下这样。
其中mw是个变量, 估计是传入的mw的值。目测这就是一个函数啊

atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'),  "mw" )

web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
我们在控制台将函数打印一下,并提取出来
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
格式化一整理, 这就是个函数啊, 我们将参数传入。一运行, 成功了。 多次校验, 这个值就是参数m的加密值。 还准备打持久战,怎么稀里糊涂就已经拿到值了。
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python

总结

按照我们原本的思路, 我们的处理逻辑是

1- 我们多次请求, 对页面进行抓包, 分析其参数。 
	猜想为: 加密参数外加cookie中其他参数
	案例中: 只有一个m参数为必须参数
2- 对js进行断点调试, 找到m参数生成的地方
	猜想为: 一段js加密, 或许会有混淆。 
	案例中: 加密逻辑为一段未格式化的<script>脚本,格式化后就能正常调用。
3- 对加密代码进行解析
	猜想为: 生成出有一段 oo0O0(mw) 的代码, 和一段window的参数代码。 需要复现两段代码逻辑, 整合后进行解密。
	案例中: 只处理了 oo0O0(mw) 函数, 并在函数中找到了eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27')); 这段数据, 在找不到window['b']的生成处后,直接打印了atob(window['b'])得到一段js代码。 解析js代码, 确认直接为加密逻辑
4- 校验, 通过读传参时的js确定参数为时间戳, 并将时间戳传入加密逻辑, 成功获取参数m的值。

js逆向需要我们有一定的js功底, 不同的js逆向难易程度都有所不同。 针对于本案例是属于比较简单的js逆向。有种还未还是解析就已经拿到了加密逻辑的感觉。 适合练手

补充

在前面说到有几个断点调试的方法,在之前的爬虫文章中也提到了, 针对这个案例,补充一下查找断点的方法
第一个:添加 xhr断点, 因为本案例中为ajax请求, 获取到了接口, 可以直接在这里打上断点
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
第二个:就是本案例中用到的, 直接callstack中断点
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python
第三个: 直接搜索参数中的page, 直接找到加密逻辑。(这个方法有一定的随机性, 谨慎使用)
web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python

代码

加密逻辑大家自己搞定, 我这里只放python代码了。将加密逻辑抠出来, 运行这段python直接获取结果。

import execjs, time, urllib.parse


def get_param_m():
    timestamp = int(time.time()) * 1000 + (16798545 + -72936737 + 156138192)
    M_time = int(timestamp/1000)
    mwqqppz = str(timestamp)

    with open ('猿人学第一题.js',encoding='utf-8') as f:
        js_data = f.read()
    js = execjs.compile(js_data)

    js_result = js.call('hex_md5', mwqqppz)

    param_m = "{}丨{}".format(js_result, M_time)

    return param_m


def get_info(page, param_m):
    import requests

    url = "https://match.yuanrenxue.cn/api/match/1?page={}&m={}".format(page, param_m)
    url = urllib.parse.quote(url, safe=':/?=&')
    print(url)
    headers = {
        'authority': 'match.yuanrenxue.cn',
        'accept': 'application/json, text/javascript, */*; q=0.01',
        'accept-language': 'zh-CN,zh;q=0.9',
        'cache-control': 'no-cache',
        'cookie': 'Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1690184377,1690941596,1690969392,1690971468; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1690184376,1690941595,1690969392,1690971468; Hm_lvt_434c501fe98c1a8ec74b813751d4e3e3=1690971476; Hm_lpvt_434c501fe98c1a8ec74b813751d4e3e3=1690971476; tk=-7962460354862954537; sessionid=1mcld1cz4z54nrnhkuxfq7wtysc7vdds; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1691027865; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1691027869',
        'pragma': 'no-cache',
        'referer': 'https://match.yuanrenxue.cn/match/1',
        'sec-ch-ua': '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
        'x-requested-with': 'XMLHttpRequest'
    }

    response = requests.request("GET", url, headers=headers).json()

    print(response['data'])
    sum = 0
    for val in response['data']:
        sum += val['value']

    mean_num = sum/len(response['data'])
    return mean_num


if __name__ == '__main__':
    sum_num = 0
    for page in range(1, 6):
        param_m = get_param_m()
        print(param_m)
        res = get_info(page ,param_m)
        print(res)
        sum_num += res
    result = sum_num/5
    print(result)

web爬虫第五弹 - JS逆向入门(猿人学第一题),爬虫,python,爬虫,javascript,python文章来源地址https://www.toymoban.com/news/detail-627611.html

到了这里,关于web爬虫第五弹 - JS逆向入门(猿人学第一题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS逆向实战16——猿人学第20题 新年挑战-wasm进阶

    本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! https://match.yuanrenxue.cn/match/20 首先进去网站,我们查看下接口 发现有两个值是改变的

    2024年02月08日
    浏览(69)
  • JS逆向之猿人学爬虫第20题-wasm

    第20题被置顶到了第1页,题目难度 写的是中等 算法很简单,就一个标准的md5算法,主要是盐值不确定, 而盐值就在wasm里面,可以说难点就在于wasm分析 加密的就是sign,sign长度是32位,这个盲猜可能就是个md5 直接跟栈的request发包位置 进去之后可以清晰的看到sign生成位置

    2024年02月15日
    浏览(59)
  • JS逆向系列之猿人学爬虫第8题-验证码-图文点选

    本题的难点就在于验证码的识别,没啥js加密,只要识别对了携带坐标就给返回数据 回过头来看验证码 这里复杂的字体比较多,人看起来都有点费劲(感觉可能对红绿色盲朋友不太又好)#x

    2024年02月13日
    浏览(44)
  • 【猿人学WEB题目专解】猿人学第18题

    🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言: 🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~ ✨个人主页:点我直达,在这里肯定能找到你想要的~ 👍专栏介绍:猿人学WEB题

    2024年02月16日
    浏览(43)
  • 【猿人学WEB题目专解】猿人学第6题

    🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言: 🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~ ✨个人主页:点我直达,在这里肯定能找到你想要的~ 👍专栏介绍:猿人学WEB题

    2024年02月08日
    浏览(101)
  • JS逆向系列之猿人学爬虫第14题-备而后动-勿使有变

    题目难度标的是困难,主要难在js混淆部分。 初始抓包有无限debugger反调试,可以直接hook 函数构造器过掉无限debugger

    2024年02月13日
    浏览(38)
  • Python爬虫猿人学逆向系列——第六题

    题目:采集全部5页的彩票数据,计算全部中奖的总金额(包含一、二、三等奖) 地址:https://match.yuanrenxue.cn/match/6 本题比较简单,只是容易踩坑。话不多说请看分析。 两个参数,一个m一个f,与cookie无关,但是这里会遇到第一个坑,在响应数据中。 可以发现只有三等奖的金

    2024年02月11日
    浏览(44)
  • Kafka入门到实战-第五弹

    声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 Apache Kafka 是一个开源的分布式事件流平台,提供高性能数据管道、流分析、 数据集成和任务关键型应用程序。 本节将在Kafka集群上执行。所有工具都可以在Kafka发行版的bin/目录下使用,

    2024年04月15日
    浏览(40)
  • 关于 Python 爬虫 JS 逆向的入门指南

    请注意,这篇指南只是一个概述,为了深入理解和实践,你可能需要额外的学习和实践。         Python 爬虫经常遇到需要逆向 JavaScript 生成的网站内容和逻辑的情况。这种技能对于爬取动态网站,尤其是那些使用了复杂 JS 逻辑和反爬虫技术的网站,尤其重要。 Python 爬虫概

    2024年01月16日
    浏览(44)
  • Python爬虫逆向实战案例(五)——YRX竞赛题第五题

    题目:抓取全部5页直播间热度,计算前 5 名直播间热度的 加和 地址:https://match.yuanrenxue.cn/match/5 cookie中m值分析 首先打开开发者工具进行抓包分析,从抓到的包来看,参数传递了查询参数 m 与 f ,同时页面中给了提示说cookie仅有50秒的有效期,所以逆向参数可以直接通过co

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包