【JS逆向学习】猿人学第二题-动态cookie

声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除!

逆向目标

网址: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)

详细代码大家有需要的自取 猿人学第二题源码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗雅颂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值