篇幅有限

完整内容及源码关注公众号:ReverseCode,发送

题目

https://match.yuanrenxue.com/match/1

抓取所有(5页)机票的价格,并计算所有机票价格的平均值,填入答案。

抓包

打开控制台开始抓包,出现无限debugger循环,可以通过Never pause here或Fiddler过掉。

方案一:在第2行选中右键Never pause here

方案二:通过查看该debug的js名为uzt.js,本地创建uzt.js并修改其中的jsFiddler的AutoResponder下,选中Enable automatic reaponses 和Unmatched requests passthrough

通过翻页获取请求https://match.yuanrenxue.com/api/match/1,参数得其中1607516709为秒时间戳,即time.time()

page: 2
m: 3ddf4f4e72bd84562a0e0104d425a791丨1607657864

分析

搜索丨中文竖线,未果,目测做了js混淆加密。添加XHR断点api/match/1跟踪调用栈到request发现被源码被混淆加密。

将该页面js拷贝下来,存到demo.js中,开始反混淆

git clone https://gitee.com/virjar/jsrepair.git
cd jsrepair
npm i
node cli.js demo.js  开始反混淆

反混淆结果如下,_0x2268f9为毫秒时间戳

window['url'] = '/api/match/1';
request = function () {var _0x2268f9 = Date['parse'](new Date()) + (16798545 + -72936737 + 156138192), _0x57feae = oo0O0(_0x2268f9['toString']()) + window['f'];const _0x5d83a3 = {};_0x5d83a3['page'] = window['page'];_0x5d83a3['m'] = _0x57feae + '丨' + _0x2268f9 / (-1 * 3483 + -9059 + 13542);var _0xb89747 = _0x5d83a3;$['ajax']({...});
};
request();

搜索oo0O0,扣出所在的js

function oo0O0(mw) {window.b = '';for (var i = 0, len = window.a.length; i < len; i++) {console.log(window.a[i]);window.b += String[document.e + document.g](window.a[i][document.f + document.h]() - i - window.c)}var U = ['W5r5W6VdIHZcT8kU', 'WQ8CWRaxWQirAW=='];var J = function(o, E) {o = o - 0x0;var N = U[o];if (J['bSSGte'] === undefined) {var Y = function(w) {var m = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=',T = String(w)['replace'](/=+$/, '');var A = '';for (var C = 0x0, b, W, l = 0x0; W = T['charAt'](l++); ~W && (b = C % 0x4 ? b * 0x40 + W : W, C++ % 0x4) ? A += String['fromCharCode'](0xff & b >> (-0x2 * C & 0x6)) : 0x0) {W = m['indexOf'](W)}return A};var t = function(w, m) {var T = [],A = 0x0,C, b = '',W = '';w = Y(w);for (var R = 0x0, v = w['length']; R < v; R++) {W += '%' + ('00' + w['charCodeAt'](R)['toString'](0x10))['slice'](-0x2)}w = decodeURIComponent(W);var l;for (l = 0x0; l < 0x100; l++) {T[l] = l}for (l = 0x0; l < 0x100; l++) {A = (A + T[l] + m['charCodeAt'](l % m['length'])) % 0x100, C = T[l], T[l] = T[A], T[A] = C}l = 0x0, A = 0x0;for (var L = 0x0; L < w['length']; L++) {l = (l + 0x1) % 0x100, A = (A + T[l]) % 0x100, C = T[l], T[l] = T[A], T[A] = C, b += String['fromCharCode'](w['charCodeAt'](L) ^ T[(T[l] + T[A]) % 0x100])}return b};J['luAabU'] = t, J['qlVPZg'] = {}, J['bSSGte'] = !![]}var H = J['qlVPZg'][o];return H === undefined ? (J['TUDBIJ'] === undefined && (J['TUDBIJ'] = !![]), N = J['luAabU'](N, E), J['qlVPZg'][o] = N) : N = H, N};eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));return ''
}

由于本js中返回'',所以只需要关注eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));中做了什么操作。atob是解码使用 base-64 编码的字符串的函数,通过console中获取atob(window['b'])

通过WT-JS加载计算window.f=hex_md5(mwqqppz)

报错未定义,mwqqppz可能是被其他地方替换或者加密来的,eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));中的J方法在oo0O0中被定义,且J方法中引用了U,在控制台定义J和U方法后,再执行J方法

var U = ['W5r5W6VdIHZcT8kU', 'WQ8CWRaxWQirAW=='];
var J = function (o, E) {...
}

拼接得到eval(atob(window['b'])[replace]('mwqqppz', '\x27' + mw + '\x27'));,搜索\bmw\b,发现mw为oo0O0的入参,即时间戳

atob(window['b'])返回的js后追加get_m_value方法获取m=window.f的值

function get_m_value() {var timestamp = Date.parse(new Date()) + 100000000;// timestamp = '1607657864000'f = hex_md5(timestamp+'')var m = f;m = m + '丨' + timestamp / 1000return m;
}

爬虫

import time
import execjs
import requests
def get_page(page_num,parameters):url = 'http://match.yuanrenxue.com/api/match/1?page={}&m={}'.format(page_num,parameters)headers = {'Host': 'match.yuanrenxue.com','Referer': 'http://match.yuanrenxue.com/match/1','User-Agent': 'yuanrenxue.project','X-Requested-With': 'XMLHttpRequest','Cookie': 'qpfccr=true; Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1607556997,1607557857; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1607557857; no-alert=true'}response = requests.get(url=url,headers=headers)return response.json()def calculate_m_value():with open(r'1.js',encoding='utf-8',mode='r') as f:JsData = f.read()psd = execjs.compile(JsData).call('request')psd = psd.replace('丨','%E4%B8%A8')print('this request parameters is :',psd)return psdif __name__ == '__main__':sum_num = 0index_num = 0for page_num in range(1,6):res = get_page(page_num,calculate_m_value())data = [__['value'] for __ in res['data']]print(data)sum_num+=sum(data)index_num += len(data)time.sleep(1)average = sum_num/index_numprint('the answer is :',average)

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

猿人学之js混淆源码乱码相关推荐

  1. 猿人学js混淆-源码乱码解法总结

    猿人学js混淆-源码乱码解法总结 网址 解法 心得 网址 js混淆-源码乱码网址 解法 我是在360浏览器下打开网址,进入审查元素. 打开第2页 发现请求网址为:http://match.yuanre ...

  2. Python反反爬之JS混淆---源码乱码(详细教程)

    写在前面 很早之前在吾爱破解论坛上看见了[猿人学]Web端爬虫攻防大赛,当时进入他们官网的时候,比赛已经结束了.看着那些题目还挺有意思的,但由于各种原因一直没有机会去做那些题目.最近比较闲,就去把猿人 ...

  3. Chapter Three:实战 js 混淆 - 源码乱码(简单)

    目录 1.第一题: js 混淆 - 源码乱码(简单) 1.1 前置知识 1.2 猿人学Web端爬虫攻防刷题平台-第一题 1.2.1 简单分析 1.2.2 js逆向过程分析 1.2.3 代码实现 1.第 ...

  4. 猿人学试题(非常简单js混淆、雪碧图、样式干扰 css加密、js混淆源码乱码、js混淆动态cookie、访问逻辑)

    学习目标: python学习-猿人学试题 学习内容: 1.非常简单js混淆 2.雪碧图.样式干扰 css加密 3.js混淆源码乱码 4.js混淆动态cookie 5.访问逻辑 1.非常简单js混淆 试 ...

  5. Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)

    地址: 第一题地址 题目: 抓取所有(5页)机票的价格,并计算所有机票价格的平均值,填入答案. 初探: 进入网站,惯例先开F12康康 这里被 debugger 卡住了: 你可以 选中行号点右键点 Ed ...

  6. js 混淆 - 源码乱码

    关闭调试 关闭调试:一律不在此处暂停. 查看接口调用栈 查看request: 带有混淆,用de4js反混淆: 看到了接口地址,参数m: var _0x2268f9 = Date['parse'](ne ...

  7. 猿人学web端爬虫攻防大赛赛题解析_第一题:源码乱码

    第一题:js 混淆 - 源码乱码 1.前言 2.题目理解 3.逆向(踩坑)分析过程 3.1.初步分析 3.2.当头一棒 3.3.循序渐进 3.4.大功告成 4.结语 1.前言 接触网络爬虫已经有两三年 ...

  8. 常用JS库源码 - store.js源码/underscore.js源码

    常用JS库源码 Store.js源码 "use strict" // Module export pattern from // https://github.com/umdjs/ ...

  9. html5连连看源码解析,JS连连看源码完美注释版(推荐)

    JS连连看源码完美注释版 table{ border-collapse: collapse; } td{ border: solid #ccc 1px; height: 36px; width: 36 ...

最新文章

  1. Netty实现心跳机制与断线重连
  2. 深度学习先驱Bengio:AI顶会论文的Deadline是时候取消了
  3. 解决minikube启动时若干问题
  4. python3.6.0安装教程-CentOS7安装Python3.6
  5. MyBatis使用ResultMap处理一对多多对一
  6. java正则 找出数字_Java使用正则表达式实现找出数字功能示例
  7. [RabbitMQ]工作原理_原理名词解释
  8. python bar图_python使用matplotlib绘图 — barChart | 学步园
  9. 飞鸽传书有关举证不够严谨
  10. Kruskal算法:贪心+并查集=最小生成树
  11. Android——通讯录
  12. 北京2018年通信工程师考试报名通知
  13. easypoi 表头数据导入_使用easypoi根据表头信息动态导出excel
  14. 【测试】史上最详细的测试用例设计方法讲解
  15. Python collections.Counter()用法
  16. eclipse Helio项目简介
  17. 用计算机查找文件地址吗,如何快速搜索电脑里的文件( 快速准确定位和查找电脑文件位置的方法...
  18. 出轨的是老公为什么要老婆做出改变
  19. 计算机毕业设计Java医院管理系统(系统+源码+mysql数据库+Lw文档)
  20. 【模拟】【NOIP2008】笨小猴 word

热门文章

  1. 华为OD机试真题 Python 实现【开放日活动】【100%通过率】【2022.11 Q4 新题】
  2. 开机弹框显示IGCCTray.exe异常的修复方式
  3. python修改电脑桌面壁纸_python设置windows桌面壁纸的方法
  4. 摄像头水平视野垂直视野?_动物穿越:新视野的梦想更新
  5. scrapy_redis去重优化(已有7亿条数据),附Demo福利
  6. Collection集合家族
  7. PPT中图表不同粘贴方式的区别
  8. centos系统 yum 安装php-redis扩展
  9. Spark中RDD的sortBy排序的5种实现方法
  10. python 雷达图像识别_Python 新一代多普勒天气雷达基数据可视化