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

本文详细介绍了如何解决一个爬虫攻防大赛的第一题,涉及Js混淆代码的解析,关键参数m的追踪与解密,以及最终如何通过Python爬取所有机票价格并计算总和。通过对源码的分析,找到了混淆函数oo0O0,揭示了m的构造逻辑,涉及到的时间戳和md5加密方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地址:

第一题地址

题目:

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

初探:

进入网站,惯例先开F12康康

这里被 debugger 卡住了;

在这里插入图片描述
你可以 选中行号点右键点 Edit breakpoint
在这里插入图片描述
输入 Conditional breakpoints=true,然后点回车,刷新下
在这里插入图片描述
如果你比较懒,你也可以在行号点右键,
点击 Add conditional breapoint 输入false,然后点回车,刷新下
在这里插入图片描述
在这里插入图片描述
但是如果你跟我一样懒的话,我们直接点 Never pause here 就行
在这里插入图片描述

抓包分析:

点击 Network ,康康接口参数,只有一个参数m,长成这样应该是被加密了;
在这里插入图片描述
刷新下,发现m一直在变,但后面有一串乱码变化不大;
在这里插入图片描述

用 Chrome 自带的 视图解析 功能解析下url:视图解码后发现是 | 后面跟着一串数值,每次刷新都在小幅上涨,盲猜应该是时间。
在这里插入图片描述

也就是说只要解开m的构造逻辑,我们就可以开始爬数据了;

关键点定位:

既然知道 m 是唯一的请求参数,那就好办了。

先直接在源码里简单搜索下,看看有没有思路。

点击 Elements 跳到页面的源码页,ctrl + f 唤醒搜索框,直接搜索 m=
在这里插入图片描述
Bingo!一发入魂,我们来看看找到了什么
在这里插入图片描述
一个名为 oo0O0 的方法,看起来这个命名不是特别规范;不管他我们之间看变量 m

var m = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",

这个 m 初始值,不是我们要找那个 m ;我们看看下一个
在这里插入图片描述

window.url = "/api/match/1";

这不是我们的 url 吗?我们找到 m 确认下

var m = oo0O0(timestamp.toString()) + window.f;

没错,这就是我们要找到那个 m ,oo0O0 这个函数我们刚刚也见过;在浏览器看太伤眼了;我们这两个js脚本考出来美化下;

w();
dd();
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 "";
}
window.url = "/api/match/1";
request = function () {
   
    var timestamp = Date.parse(new Date()) + 100000000;
    var m = oo0O0(timestamp.toString()) + window.f;
    var list = {
    page: window.page, m: m + "丨" + timestamp / 1000 };
    $.ajax({
   
        url: window.url,
        dataType: "json",
        async: false,
        data: list,
        type: "GET",
        beforeSend: function (request) {
    },
        success: function (data) {
   
            data = data.data;
            let html = "";
            let us_sign = `<div class="b-airfly"><div class="e-airfly"data-reactid=".1.3.3.2.0.$KN5911.0"><div class="col-trip"data-reactid=".1.3.3.2.0.$KN5911.0.0"><div class="s-trip"data-reactid=".1.3.3.2.0.$KN5911.0.0.0"><div class="col-airline"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.0"><div class="d-air"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.0.0:$0"><div class="air"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.0.0:$0.0"><span data-reactid=".1.3.3.2.0.$KN5911.0.0.0.0.0:$0.0.1">中国联合航空</span></div><div class="num"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.0.0:$0.1"><span class="n"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.0.0:$0.1.0">KN5911</span><span class="n"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.0.0:$0.1.1">波音737(中)</span><noscript data-reactid=".1.3.3.2.0.$KN5911.0.0.0.0.0:$0.1.2"></noscript></div></div><noscript data-reactid=".1.3.3.2.0.$KN5911.0.0.0.0.1"></noscript></div><div class="col-time"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1"><div class="sep-lf"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.0"><h2 data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.0.0">13:50</h2><p class="airport"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.0.1"><span data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.0.1.0">大兴国际机场</span><span data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.0.1.1"></span></p></div><div class="sep-ct"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.1"><div class="range"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.1.0">3小时40分钟</div><div class="line"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.1.1"></div></div><div class="sep-rt"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.2"><noscript data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.2.0"></noscript><h2 data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.2.1">17:30</h2><p class="airport"data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.2.2"><span data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.2.2.0">宝安机场</span></p></div><noscript data-reactid=".1.3.3.2.0.$KN5911.0.0.0.1.3"></noscript></div></div></div><div class="col-price"data-reactid=".1.3.3.2.0.$KN5911.0.1"><p class="prc"data-reactid=".1.3.3.2.0.$KN5911.0.1.0"><span data-reactid=".1.3.3.2.0.$KN5911.0.1.0.0"><i class="rmb"data-reactid=".1.3.3.2.0.$KN5911.0.1.0.0.0">&yen;</i><span class="fix_price"data-reactid=".1.3.3.2.0.$KN5911.0.1.0.0.1"><span class="prc_wp"style="width:48px">price_sole</span></span></span></p><div class="vim"data-reactid=".1.3.3.2.0.$KN5911.0.1.1"><span class="v dis"data-reactid=".1.3.3.2.0.$KN5911.0.1.1.$0"></span></div></div><div class="col-fold"data-reactid=".1.3.3.2.0.$KN5911.0.2"><p class="fd"data-reactid=".1.3.3.2.0.$KN5911.0.2.0">收起</p></div></div><noscript data-reactid=".1.3.3.2.0.$KN5911.1"></noscript></div>`;
            let choice = [
                "中国南方航空",
                "吉祥航空",
                "奥凯航空",
                "九元航空",
                "长龙航空",
                "东方航空",
                "中国国际航空",
                "深圳航空",
                "海南航空",
                "春秋航空",
                "上海航空",
                "西部航空",
                "重庆航空",
                "西藏航空",
                "中国联合航空",
                "云南祥鹏航空",
                "云南英安航空",
                "厦门航空",
                "天津航空",
                "山东航空",
                "四川航空",
                "华夏航空",
                "长城航空",
                "成都航空有",
                "北京首都航空",
                "中华航空",
                "意大利国家航空公司",
                "印度百捷航空",
                "越南航空",
                "远东航空",
                "印度航空公司",
                "印度捷特航空有限公司",
                "以色列航空公司",
                "意大利航空",
                "伊朗航空公司",
                "印度尼西亚鹰航空公司",
                "英国航空公司",
                "西方天空航空",
                "西捷航空",
                "西班牙欧洲航空公司",
                "西班牙航空公司",
                "中国南方航空",
                "吉祥航空",
                "奥凯航空",
                "九元航空",
                "长龙航空",
                "东方航空",
                "中国国际航空",
                "深圳航空",
                "海南航空",
                "春秋航空",
                "上海航空",
                "西部航空",
                "重庆航空",
                "西藏航空",
                "中国联合航空",
                "云南祥鹏航空",
                "云南英安航空",
                "厦门航空",
                "天津航空",
                "山东航空",
                "四川航空",
                "华夏航空",
                "长城航空",
                "成都航空有",
                "北京首都航空",
                "中华航空",
                "意大利国家航空公司",
                "印度百捷航空",
                "越南航空",
                "远东航空",
                "印度航空公司",
                "印度捷特航空有限公司",
                "以色列航空公司",
                "意大利航空",
                "伊朗航空公司",
                "印度尼西亚鹰航空公司",
                "英国航空公司",
                "西方天空航空",
                "西捷航空",
                "西班牙欧洲航空公司",
                "西班牙航空公司",
            ];
            let op = 1;
            let jic = [
                "北京首都国际机场",
                "上海虹桥国际机场",
                "上海浦东国际机场",
                "天津滨海国际机场",
                "太原武宿机场",
                "呼和浩特白塔机场",
                "沈阳桃仙国际机场",
                "大连周水子国际机场",
                "长春大房身机场",
                "哈尔滨阎家岗国际机场",
                "齐齐哈尔三家子机场",
                "佳木斯东郊机场",
                "厦门高崎国际机场",
                "福州长乐国际机场",
                "杭州萧山国际机场",
                "合肥骆岗机场",
                "宁波栎社机场",
                "南京禄口国际机场",
                "广州白云国际机场",
                "深圳宝安国际机场",
                "长沙黄花机场",
                "海口美亚机场",
                "武汉天河机场",
                "济南遥墙机场",
                "青岛流亭机场",
                "南宁吴墟机场",
                "三亚凤凰国际机场",
                "重庆江北国际机场",
                "成都双流国际机场",
                "昆明巫家坝国际机场",
                "昆明长水国际机场",
                "桂林两江国际机场",
                "西安咸阳国际机场",
                "兰州中川机场",
                "贵阳龙洞堡机场",
                "拉萨贡嘎机场",
                "乌鲁木齐地窝堡机场",
                "南昌向塘机场",
                "郑州新郑机场",
                "北京首都国际机场",
                "上海虹桥国际机场",
                "上海浦东国际机场",
                "天津滨海国际机场",
                "太原武宿机场",
                "呼和浩特白塔机场",
                "沈阳桃仙国际机场",
                "大连周水子国际机场",
                "长春大房身机场",
                "哈尔滨阎家岗国际机场",
                "齐齐哈尔三家子机场",
                "佳木斯东郊机场",
                "厦门高崎国际机场",
                "福州长乐国际机场",
                "杭州萧山国际机场",
                "合肥骆岗机场",
                "宁波栎社机场",
                "南京禄口国际机场",
                "广州白云国际机场",
                "深圳宝安国际机场",
                "长沙黄花机场",
                "海口美亚机场",
                "武汉天河机场",
                "济南遥墙机场",
                "青岛流亭机场",
                "南宁吴墟机场",
                "三亚凤凰国际机场",
                "重庆江北国际机场",
                "成都双流国际机场",
                "昆明巫家坝国际机场",
                "昆明长水国际机场",
                "桂林两江国际机场",
                "西安咸阳国际机场",
                "兰州中川机场",
                "贵阳龙洞堡机场",
                "拉萨贡嘎机场",
                "乌鲁木齐地窝堡机场",
                "南昌向塘机场",
                "郑州新郑机场",
            ];
            if (window.page) {
   
            }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值