当前位置: 首页 > news >正文

【中等】 猿人学web第一届 第6题 js混淆-回溯

文章目录

  • 请求流程
    • 请求参数
  • 加密参数定位
    • r() 方法
      • z() 方法
  • 加密参数还原
    • JJENCOde js代码加密
    • 环境检测
      • _n("jsencrypt")
      • 1
      • 2
      • 3
      • 4
      • 5
  • 计算全部中奖的总金额
  • 请求代码
    • 注意

请求流程

请求参数

打开 调试工具,查看数据接口 https://match.yuanrenxue.cn/api/match/6

在这里插入图片描述

请求参数携带了 m,q 参数
q参数 “点击次数” + “-” + “时间戳” + “|”
m参数为加密值

cookie 没有加密字段
在这里插入图片描述

加密参数定位

查看请求堆栈在这里插入图片描述

对应的请求参数
在这里插入图片描述
t 在 node 中直接声明即可

window.i = '';  // 初始值 ''
request = function() {t = Date.parse(new Date());  // 时间戳,直接在 node 中定义即可var list = {"page": window.page,  // 对应的页码信息// t 在上方有声明// window.o 是点击页面页码的次数,为 1"m": r(t, window.o),// windiw.i  = windiw.i + window.o + '-' + t + "|""q": window.i += window.o + '-' + t + "|",};window.o += 1;  // 页面每请求完一次之后 window.o会自增

r() 方法

上断点刷新页面在对应的位置断住,查看 r 方法在这里插入图片描述
在这里插入图片描述

// window.o 初始值为 1
// 每点击一次 window.o 就会自增 1
// 初始值为 1, 点击 4 次页码后就会执行 if 块里的代码
if (window.o >= 6) {alert('不要戳这么多下,人家好痛嘛~');  // 弹窗location.reload();  // 刷新页面
}

z() 方法

在这里插入图片描述

var n = _n(“jsencrypt”); // _n 是在上方自执行函数中赋值的
在这里插入图片描述

加密参数还原

分析 delect.js 文件

JJENCOde js代码加密

在文件的开头有很长的一段 JJENCODE 加密的代码
在这里插入图片描述

仔细观察这段 JJencode 代码
前面是给变量赋值的操作
最后一行代码是将前面赋值的变量加起来并执行
在这里插入图片描述
将最后一行代码放在浏览器执行
在 JJENCODE 最后一行代码打上断点并刷新页面
将代码最后一行的括号删除
在这里插入图片描述
这行代码实际上生成了一个 自执行函数
给 window.o 赋予了初始值 1
在这里插入图片描述

这段代码在 node 中并不用扣

环境检测

整个加密的值是在 _n 方法中生成的

function z(pwd, time) {var n = _n("jsencrypt");  // 主要是靠 _n 加载模块var g = (new n);  // new n 方法var r = g.encode(pwd, time);  // 取 n 方法中的 encode 进行加密return r;  // 将加密的值返回
}

_n(“jsencrypt”)

前面有说到 _n 是在一个 自执行函数中赋值的
在这里插入图片描述

将自执行函数 copy到本地, 模拟执行
在这里插入图片描述

1

window = {};

在这里插入图片描述

2

xe = [][(![] + [])[!+[] + !![] + !![]] + ([] + {})[+!![]] + (!![] + [])[+!![]] + (!![] + [])[+[]]][([] + {})

在这里插入图片描述

3

window.addEventListener ? window.addEventListener(“mousemove”, Be, !1) : window.attachEvent && window.attachEvent(“onmousemove”, Be)

在这里插入图片描述

4

s = navigator

在这里插入图片描述

5

r = t || navigator && navigator.userAgent,

在这里插入图片描述

在 node 文件

window = global;
navigator = {userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
};// 这里是浏览器中的自执行函数// 这里是自己定义的方法,方便 python 调用
function sdk(time, clickNum){//  _n 加载模块let n = _n("jsencrypt")// 模拟浏览器执行函数let g = new n;return g.encode(time, clickNum);
}

计算全部中奖的总金额

接口只返回三等奖的金额

在这里插入图片描述
计算 1,2,3 等奖的值,并除以三等奖
(142620 + 76064 + 9508) / 9508 = 24
(47730 + 25456 + 3182) / 3182 = 24
(131085 + 69912 + 8739) / 8739 = 24
得出 3等奖的金额 * 24 就为全部中奖的金额

请求代码

python 代码

import requests
import execjs
import timeheaders = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
}
cookies = {"sessionid": "你的sessionid",
}def call_js(file_name, func_name, *args):with open(file_name, mode='r', encoding='utf-8') as f:js_code = execjs.compile(f.read())return js_code.call(func_name, *args)def send_match6(page, click):url = "https://match.yuanrenxue.cn/api/match/6"time_ = int(str(int(time.time() * 1000))[:10] + '000')q = str(click) + '-' + str(time_) + '|'m = call_js('6.js', 'sdk', time_, click)params = {"page": f'{page}',"m": m,"q": q}response = requests.get(url, headers=headers, cookies=cookies, params=params)print(params)print(response.text)print('==================================================')if __name__ == '__main__':str_concat = ''click_Nums = 1for page in range(1, 6):concat = send_match6(page, click_Nums)click_Nums += 1str_concat = concat

注意

浏览器请求的时候,q 参数值是自增的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在 python 中,不需要自增,自增反而会被检测到
大概率是浏览器自增了,但是发送给服务器的数据只是这一次生成的值,并没有发送拼接了的值

相关文章:

【中等】 猿人学web第一届 第6题 js混淆-回溯

文章目录 请求流程请求参数 加密参数定位r() 方法z() 方法 加密参数还原JJENCOde js代码加密环境检测_n("jsencrypt")12345 计算全部中奖的总金额请求代码注意 请求流程 请求参数 打开 调试工具,查看数据接口 https://match.yuanrenxue.cn/api/match/6 请…...

低、中、高频率段具体在不同应用中的范围是多少

1、低频率段(Low Frequency Range) ①建筑声学和噪声控制:通常将20 Hz 到 200 Hz 的频率范围视为低频段。在这一范围内,声音的波长较长,通常与低音(如重低音音乐)和建筑结构中的振动有关。 ②…...

Oxford Model600 Model400低温氦压缩机cryogenic helium compressor手侧

Oxford Model600 Model400低温氦压缩机cryogenic helium compressor手侧...

Golang面试题四(并发编程)

目录 1.Go常见的并发模型 2.哪些方法安全读写共享变量 3.如何排查数据竞争问题 ​4.Go有哪些同步原语 1. Mutex (互斥锁) 2. RWMutex (读写互斥锁) 3. Atomic 3.1.使用场景 3.2.整型操作 3.3.指针操作 3.4.使用示例 4. Channel 使用场景 使用示例 5. sync.WaitGr…...

计算机学生高效记录并整理编程学习笔记的方法

哪些知识点需要做笔记? 以下是我认为计算机学生大学四年可以积累的笔记。 ① 编程语言类(C语言CJava):保留课堂笔记中可运行的代码部分,课后debug跑一跑。学习语言初期应该多写代码(从仿写到自己写&#…...

【书生大模型实战】L2-LMDeploy 量化部署实践闯关任务

一、关卡任务 基础任务(完成此任务即完成闯关) 使用结合W4A16量化与kv cache量化的internlm2_5-7b-chat模型封装本地API并与大模型进行一次对话,作业截图需包括显存占用情况与大模型回复,参考4.1 API开发(优秀学员必做)使用Func…...

《编程学习笔记之道:构建知识宝库的秘诀》

在编程的浩瀚世界里,我们如同勇敢的探险家,不断追寻着知识的宝藏。而高效的笔记记录和整理方法,就像是我们手中的指南针,指引着我们在这片知识海洋中前行,不至于迷失方向。在这篇文章中,我们将深入探讨如何…...

DETR论文,基于transformer的目标检测网络 DETR:End-to-End Object Detection with Transformers

transformer的基本结构: encoder-decoder的基本流程为: 1)对于输入,首先进行embedding操作,即将输入映射为向量的形式,包含两部分操作,第一部分是input embedding:例如,在NLP领域&…...

untiy有渲染线程和逻辑线程嘛

之前我也这么认为,其实unity引擎是单线程的,当然后续的jobs不在考虑范围内 如果你在一个awake 或者 start方法中 延时,是会卡住主线程的 比如 其实游戏引擎有一个基础简单理解,那就是不断的进行一个循环,在这个周期循…...

什么是数据仓库ODS层?为什么需要ODS层?

在大数据时代,数据仓库的重要性不言而喻。它不仅是企业数据存储与管理的核心,更是数据分析与决策支持的重要基础。而在数据仓库的各个层次中,ODS层(Operational Data Store,操作型数据存储)作为关键一环&am…...

permutation sequence(

60. Permutation Sequence class Solution:def getPermutation(self, n: int, k: int) -> str:def rec(k, l, ans, n):if(n0): return# 保留第一个位置,剩下数字的组合leftCom math.factorial(n - 1) #用于计算 (n-1) 的阶乘值ele k // leftCommod k % leftCo…...

PCL 三线性插值

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 三线性插值是一种在三维空间中使用已知数据点进行插值的方法。它是在立方体内的插值方法,通过利用立方体的八个顶点的已知值来估算立方体内任意一点的值。三线性插值扩展了一维的线性插值和二维的双线性插值。其基…...

JVM虚拟机(一)介绍、JVM内存模型、JAVA内存模型,堆区、虚拟机栈、本地方法栈、方法区、常量池

目录 学习JVM有什么用、为什么要学JVM? JVM是什么呢? 优点一:一次编写,到处运行。(Write Once, Run Anywhere,WORA) 优点二:自动内存管理,垃圾回收机制。 优点三&am…...

Python利用xlrd复制一个Excel中的sheet保留原格式创建一个副本(注:xlrd只能读取xls)

目录 专栏导读库的介绍库的安装完整代码总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文…...

40、Python之面向对象:扩展的对象属性解析顺序(描述符 + MRO)

引言 在上一篇文章中,我们简单回顾了Python中在继承语境下的属性解析顺序,同时补充了能够控制、影响属性解析的3个函数/方法(2个魔术方法 1个内置函数),相信对Python中属性的解析,相较于MRO,有…...

stm32—时钟、定时器和看门狗

1. 时钟 什么是时钟呢? 一个可以产生周期性信号的设备 什么是周期性信号? 1 ----- ----- ----- 0 ----- ----- ----- 所以时钟信号就是周期性变化的信号 关于时钟我们有两个比较重要…...

Windows平台RTSP|RTMP播放器如何实时调节音量

我们在做Windows平台RTSP、RTMP播放器的时候,有这样的技术需求,特别是多路监控的时候,并不是每一路audio都需要播放出来的,所以,这时候,需要有针对音量调节的设计: /** smart_player_sdk.cs* C…...

Leetcode JAVA刷刷站(10)正则表达式匹配

一、题目概述 二、思路方向 在Java中,实现一个支持.和*的正则表达式匹配器,可以通过递归或动态规划(DP)的方法来完成。这里,我将使用动态规划的方法来解决这个问题,因为它更容易理解和实现。 动态规划的思…...

合并图片为pdf

1.先使用IDM在网页下载: 2.按文件类型分组,在按名称大小排序,之后使用Acrobat合并文件成一个pdf即可...

【Linux Install】Ubuntu20, Windows10 双系统安装

1. 制作启动盘 1.1 下载 Ubuntu 系统镜像 ISO 文件 从 Ubuntu 官网下载 (https://cn.ubuntu.com/download/desktop)。官网访问慢的,从国内镜像点下。 1.2 烧录 Ubuntu ISO 镜像 下载 Rufus:从Rufus官网下载 Rufus 工具。 插入U 盘:将U盘插…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...