Python爬虫猿人学逆向系列——第六题

题目:采集全部5页的彩票数据,计算全部中奖的总金额(包含一、二、三等奖)

在这里插入图片描述

地址:https://match.yuanrenxue.cn/match/6

本题比较简单,只是容易踩坑。话不多说请看分析。

在这里插入图片描述

两个参数,一个m一个f,与cookie无关,但是这里会遇到第一个坑,在响应数据中。

在这里插入图片描述

可以发现只有三等奖的金额,并没有一等奖和二等奖的金额。所以我们需要找到三者的关系。直接来到source中查看。

在这里插入图片描述

直接搜索value,一共17个结果,一个一个观察。在第12个时,其相关的内容。

在这里插入图片描述

这里意思是总金额为三等奖的24倍,具体是不是这样呢,我们来验证一下。

在这里插入图片描述

还真是,那么就是说总中奖金额就是总三等奖金额的24倍。第一个坑解决。接下来开始逆向参数,刚刚已经知道了需要的参数就两个,m和q,传书的是parmas参数,所以我们直接来跟栈。

在这里插入图片描述

跟到请求时的栈,代码非常简单,如下:

在这里插入图片描述

找到之后直接打上断点,先看m的值。

在这里插入图片描述

这里就是入口函数,可以看到当window.o的值大于等于6的时候就会重新加载页面,那估计这个window.o可能是会增加的,并且有可能和页数有关。

在这里插入图片描述

现在它的值为1,访问下一页看看。

在这里插入图片描述

果然,变成2了,那也就是说我们在本地运行的时候他不可能大于等于6,因为我们最多就循环五次爬个五页,根本不说手抖戳它这么多下。所以这里的代码我们就可以稍微简化一下不要r函数了,直接一步到位到z函数。

在这里插入图片描述

z函数其实熟悉js的话一看就知道这就是webpack的调用的方式。翻到最上方

在这里插入图片描述

果然,就是一个webpack,那还不简单,模块加载器如此的标准,我都不好意思去删删改改了,直接全部copy。接下来就调用z函数看看会出现什么样的问题了。

在这里插入图片描述

window没有定义,那我们就给他定义一个window。在最开头加上一个var window = global;然后再执行,就会发现一样的错误,这个时候大家就会发现了,报的是window.o = 1这个位置的window没有定义。那问题来了,大家ctrl+f搜索看看,这代码里面有没有window.o呢?答案是没有。

所以,window.o在肯定是在代码中,至于为什么搜不到,那当然就是被混淆了,所以我们就来看看混淆的代码,就在最开头的位置,一个很明显的AA混淆,将它还原一下,这种混淆由专门的工具还原,手动还原的话就直接去掉最后的括号然后执行就可以了。

在这里插入图片描述

去掉最后的括号后可以看到这混淆的代码就是一个匿名函数,这个函数的逻辑就是给window.o进行赋值,值为1,所以我们将这段混淆代码替换成window.o = 1就可以了。

在这里插入图片描述

接下来就是下一个错误了,关键词ASN1,这个相当于也是考了一下对js的熟悉程度,就看大家平时经验的积累了,ASN1就是一个js的解码器,它能够解码任何有效的base64的编码或者十六进制编码的DER或BER结构,这个玩意儿在浏览器中一般都是存在的,但问题是nodejs不存在啊。所以,既然这个问题出现了,那肯定就是代码中出现了nodejs无法解码的存在了,那我们就来慢慢找一下这些代码都在什么地方。一直翻一直翻。

在这里插入图片描述

找到了,1161行,大家和我的误差应该就几行的误差,自己找很废时间,反正我眼睛看瞎了已经。这很明显又是一段混淆代码,jsfuck的混淆,老规矩,还原一下。直接全部复制到console中执行一下看看结果是什么。

在这里插入图片描述

就是一个false…那就直接替换了吧。再执行代码,会发现还是这个错误。

在这里插入图片描述

那证明这里面可能还有,已经找到过一次有经验了,知道了是jsfuck混淆,那我们就搜一下特殊符号![

在这里插入图片描述

果然,又来了。直接还原替换

在这里插入图片描述

啥也不是,那就直接删掉。然后再执行,还是会报了这个错误,但是这个时候代码中已经没有混淆代码了,那问题来了,什么原因导致的呢,定位到报错的2559行,看下能不能删除这个逻辑?

在这里插入图片描述

好吧,根本删不掉,关联度太高。那问题来了,从这里来看的话ASN1是在本地赋值进去的,那么就是说就算本地nodejs本身没有的话这里应该也赋值进去了,为啥还会报这样的错呢?那就是说window.ASN1压根没有去赋值,要么就是直接没有window了。那就有点意思了,我们来搜索一下window。

在这里插入图片描述

一共是14个,但是…webpack里面那个window是来捣乱的吧。前面先用了window.o要我们先赋值了,你自执行里面又要置空?这不闹呢嘛?直接删掉。

在这里插入图片描述

完事,直接出结果。这里其实就涉及的是浏览器的环境和nodejs环境的不同,在浏览器中window是不能被重新赋值的,所以webpack中的这个置空并没有任何意义,但是在nodejs中就不一样了,window可以被重新赋值,因此就直接导致了上方我们看到的错误信息了。

搞定之后我们来对比一下浏览器中的值和本地执行的结果是否能够匹配上了。将浏览器中传入的参数复制下来运行一下(刷新了下页面重新获取的两个参数值)。

在这里插入图片描述

在这里插入图片描述

两个结果完全一致,那么到这里参数m就完成了。

接下来就是q参数,q参数从逻辑来看

在这里插入图片描述

就是其拼接出来的格式就是1-1692867522000|这样的,但是这里需要注意,由于我们会话并没有保持,相当于每一次都是一个新的请求,同时浏览器中window.o能够每次执行js代码的时候自增,但本地可不会,所以我们就按照每次都是全新的请求来实现参数q,如果是浏览器中那样的格式的话最终会将前面的值拼接起来,如下:

在这里插入图片描述

但我们本地的话就不能再拼接了,否则是会触发这个页面的风控的,接下来就给大家看一下这两种情况在本地的时候的结果,一个能够成功获取值,一个则触发风控。先来写一个js代码的入口函数。

function run(o) {t = Date.parse(new Date())res = z(t, o);return {'m': res,'t': t,}
}

第一种情况,触发风控。

在这里插入图片描述

这就是按照浏览器模式来实现q值时的结果,所以直接全新请求即可,不用拼接前面的值。

在这里插入图片描述

最后将所有的value加起来再乘以24就获取到正确答案了,答案为6883344
在这里插入图片描述

完整代码请转https://gitee.com/shuailiuquan/spider-code/tree/master

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/53469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章四

软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章四 一、论软件的静态演化和动态演化及其应用1.论文题目2.写作要点和写作素材二、论大规模分布式系统缓存设计策略1.论文题目2.写作要点和写作素材三、论基于REST服务的Web应用系统设计1.论文题目2.写…

SpringBoot原理

一、Bean原理 1、配置文件的优先级 SpringBoot项目当中支持的三类配置文件: ​ - application.properties - application.yml - application.yaml 配置文件优先级排名(从高到低): 1. properties配置文件 2. yml配置文件 3. yaml…

【PHP】PHP变量

1、变量介绍 PHP 是一门弱类型语言&#xff0c;不必向 PHP 声明该变量的数据类型。PHP 会根据变量的值&#xff0c;自动把变量转换为正确的数据类型。在强类型的编程语言中&#xff0c;必须在使用变量前先声明&#xff08;定义&#xff09;变量的类型和名称。 <?php $x5;…

代码随想录算法训练营day46 | LeetCode 139. 单词拆分

139. 单词拆分&#xff08;题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台&#xff09; 思路&#xff1a;又是一种不同形式的背包问题&#xff0c;求一个字符串是否能由字符串数组中的若干字符排列组成。首相想到排列&#xff0…

cuda11.1和cuDNN v8.8.1的安装目录问题

cuda的不同版本文件路径是不一致的&#xff0c;在cuda10.1中&#xff0c;配置cudnn的文件路径是&#xff1a; sudo cp cuda/include/cudnn.h /usr/local/cuda-10.1/include/ sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda-10.1/lib64/但是在cuda11.1中&#xff0c;文件路径…

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型 文章目录 【宝藏系列】一文带你梳理 Linux 的五种 IO 模型&#x1f468;‍&#x1f3eb;前言1️⃣用户态和核心态1️⃣1️⃣用户态和核心态的切换 2️⃣进程切换3️⃣进程阻塞4️⃣文件描述符(fd, File Descriptor)5️⃣缓存I/O…

【笔记】MySQL行转列函数

GROUP_CONCAT()函数 创建表person_info&#xff0c;并插入数据 CREATE TABLE person_info (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(100) DEFAULT NULL,family varchar(100) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT8 DEFAULT CHARSETutf8;…

以太坊硬分叉后的可重入漏洞攻击

以太坊硬分叉后的可重入漏洞攻击 以太坊君士坦丁堡升级将降低部分 SSTORE 指令的 gas 费用。然而&#xff0c;这次升级也有一个副作用&#xff0c;在 Solidity 语言编写的智能合约中调用 address.transfer()函数或 address.send()函数时存在可重入漏洞。在目前版本的以太坊网络…

RecyclerView面试问答

RecycleView 和 ListView对比: 使用方法上 ListView:继承重写 BaseAdapter,自定义 ViewHolder 与 converView优化。 RecyclerView: 继承重写 RecyclerView.Adapter 与 RecyclerView.ViewHolder。设置 LayoutManager 来展示不同的布局样式 ViewHolder的编写规范化,ListVie…

基于蛾群算法优化的BP神经网络(预测应用) - 附代码

基于蛾群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于蛾群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.蛾群优化BP神经网络2.1 BP神经网络参数设置2.2 蛾群算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

会声会影2023全新中文专业版下载安装教程

熟练使用会声会影视频编辑工具&#xff0c;对视频创作过程的帮助是极大的。大家可以放心大胆地去研究会声会影的视频编辑技巧&#xff0c;会声会影2023与以往版本会声会影版本最大的区别是&#xff1a;账户制管理。可以通过账户添加或移除设备&#xff0c;非常便捷。该软件一直…

量化QAT QLoRA GPTQ

模型量化的思路可以分为PTQ&#xff08;Post-Training Quantization&#xff0c;训练后量化&#xff09;和QAT&#xff08;Quantization Aware Training&#xff0c;在量化过程中进行梯度反传更新权重&#xff0c;例如QLoRA&#xff09;&#xff0c;GPTQ是一种PTQ的思路。 QAT…

【安卓】自定义View实现画板涂鸦等功能

一、实现效果 二、代码 1、MainActivity.class package com.lsl.mydrawingboarddemo;import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat;import android.os.Bundle; import android.os.Handler; import android.view.View; impo…

Langchain-React范式调用API —— 自定义工具

因为Langchain的代码也不是很复杂&#xff0c;因此 直接看代码会更好的学习。 一些说明&#xff0c;我已经放到了注释当中。 请各位看官享用。 代码样例 from langchain.agents import initialize_agent from langchain.llms import OpenAI from langchain.tools import Bas…

封装redis 分布式锁 RedisCallback

RedisCallback 是redis 一个回调接口&#xff0c;在 Redis 连接后执行单个命令&#xff0c;返回执行命令后的结果。 如果在使用 RedisCallback 时&#xff0c;需要自动获取 Redis 连接资源&#xff0c;使用完毕后并释放连接资源。 RedisTemplate 类提供了一个 execute 方法&am…

【C++进阶(一)】STL大法以及string的使用

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; STL标准库 1. 前言2. STL库的版本以及缺陷3. ST…

FastJson中JSON,JSONObject和JSONArray简单使用

JSON中提供了常用的对象和json数据间的转换方法。 JSONObject可以看作Map&#xff0c;使用key-value构建json对象。 JSONArray可以看作List&#xff0c;使用List可以简单构造json数组对象。1.pom.xml中引入依赖<dependency><groupId>com.alibaba.fastjson2</gro…

软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现

软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现 一、分布式数据库相关知识点二、摘要三、正文四、总结一、分布式数据库相关知识点 软考高级系统架构设计师系列之:分布式存储技术

远程调试环境

一、远程调试 1.安装vscode 2.打开vscode&#xff0c;下载插件Remote-SSH,用于远程连接 3.安装php debug 4.远程连接&#xff0c;连接到远端服务器 注&#xff1a;连接远程成功后&#xff0c;在远程依然要进行安装xdebug&#xff0c;刚才只是在vscode中进行的安装。 5.配置la…

R语言最简单的计算运行时间的方法

引言 要知道哪种编程的时间短&#xff0c;R语言中应该如何编码呢&#xff1f; 方法很简单&#xff0c;使用运行前Sys.time() 和运行后Sys.time()相减既可以得到运行时间。 代码如下 代码 #### 运行前时间timestart<-Sys.time()####程序运行 x <- rnorm(100000)y <…