【中等】 猿人学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盘插…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...