声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除!
逆向目标
网址:https://match.yuanrenxue.cn/match/2
接口:https://match.yuanrenxue.cn/match/2
参数:m(cookie值)
逆向过程
老规矩,先分析网络请求,结合题目考查内容,很明显就是考查动态cookie值 m

逆向分析
这里讲点题外话,最开始看到题目的时候感觉很简单,觉得直接 hook cookie 然后跟栈分析应该就可以了,接下来直接控制台注入hook代码发现断不住,然后使用 油猴 结果也不行,下面是我的 hook 代码
(function () {
'use strict';
var cookieTemp = '';
Object.defineProperty(document, 'cookie', {
set: function (val) {
if (val.indexOf('m') != -1) {
debugger;
}
console.log('Hook捕获到cookie设置->', val);
cookieTemp = val;
return val;
},
get: function () {
return cookieTemp;
},
});
})();
没招了,只能老老实实分析网络请求,但是分析的时候有个小坑大家要注意一下,就是我们用浏览器分析网络请求的时候只能看到一次网络请求(就是实际获取到数据的网络请求),如下

但是实际上获取一次数据是有两次网络请求的,我们使用抓包工具看下

我们先来分析第一次网络请求,发现第一次网络请求返回的是混淆之后的js代码 ,我们先使用工具解下混淆,我这里用的是v_jstools

拷贝解密后的代码至本地,快速过一下发现里面有很多反调试代码,先把里面的setInterval注释掉,再次执行,继续报错如下
document.cookie = "m" + _0x575e24() + "=" + _0x5b858d(_0x5ad03a) + "|" + _0x5ad03a + "; path=/";
ReferenceError: document is not defined
缺什么补什么
window = global;
document = {};
继续执行,发现程序卡住了,说明代码里还有其他的反检测代码,我们在下面位置打上断点调试一下

我们返回浏览器观察实际的cookie值的构成
m=2365518e88d13c041f6a50d7972727a0|1709103190000
/*
结合实际的cookie值来分析代码,_0x575e24()这个函数可以直接删除
*/
function _0x1da1a5(_0x5ad03a, _0x566cf6) {
// document.cookie = "m" + _0x575e24() + "=" + _0x5b858d(_0x5ad03a) + "|" + _0x5ad03a + "; path=/";
document.cookie = "m" + "=" + _0x5b858d(_0x5ad03a) + "|" + _0x5ad03a + "; path=/";
location.reload();
}
/*
继续分析上述的_0x5b858d函数,里面内嵌的函数会让我们的代码进入无限死循环,
我们把它注释掉并直接返回true
*/
function _0x575e24(_0x18dd5b, _0x2aaabf) {
var _0x2d367a = _0x4fa74e(this, function () {
var _0x36bfa2 = function () {
var _0x20367d = _0x36bfa2.constructor("return /\" + this + \"/")().compile("^([^ ]+( +[^ ]+)+)+[^ ]}");
return !_0x20367d.test(_0x2d367a);
};
return _0x36bfa2();
});
继续执行,报错如下
undefined:6
history.pushState(0,0,i)
ReferenceError: history is not defined
调试时使用 console.log 输出时发现也会卡死,调试进入发现重写了console.log ,反调试代码如下
console = new Object()
console.log = function (s) {
while (1){
for(i=0;i<1100000;i++){
history.pushState(0,0,i)
}
}
}
console.toString = '[object Object]'
console.log.toString = 'ƒ toString() { [native code] }'
后面就都是一些处理 补环境和 反调试的的逻辑,这里就不一一处理了
逆向结果
业务逻辑用python 实现
# -*- coding: utf-8 -*-
import execjs
import requests
import urllib3
urllib3.disable_warnings()
with open('yuanrenxue.js', 'r', encoding='utf-8') as f:
jscode = f.read()
ctx = execjs.compile(jscode)
headers = {
"referer": "https://match.yuanrenxue.cn/match/2",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
"x-requested-with": "XMLHttpRequest"
}
cookies = {
"m": ctx.call('get_yrx_cookie')
}
sum = 0
for page in range(1, 6):
url = "https://match.yuanrenxue.cn/api/match/2"
params = {
"page": str(page)
}
response = requests.get(url, headers=headers, cookies=cookies, params=params)
if response.status_code == 200:
items = response.json()['data']
for item in items:
sum += int(item['value'])
print('全部5页发布日热度的和: ', sum)
详细代码大家有需要的自取 猿人学第二题源码



被折叠的 条评论
为什么被折叠?



