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

请求流程

请求参数

打开 调试工具,查看数据接口 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 time

headers = {
    "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 = 1
    for page in range(1, 6):
        concat = send_match6(page, click_Nums)
        click_Nums += 1
        str_concat = concat

注意

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

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

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值