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

地址:

第一题地址

题目:

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

初探:

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

这里被 debugger 卡住了;

Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第1张图片
你可以 选中行号点右键点 Edit breakpoint
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第2张图片
输入 Conditional breakpoints=true,然后点回车,刷新下
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第3张图片
如果你比较懒,你也可以在行号点右键,
点击 Add conditional breapoint 输入false,然后点回车,刷新下
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第4张图片
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第5张图片
但是如果你跟我一样懒的话,我们直接点 Never pause here 就行
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第6张图片

抓包分析:

点击 Network ,康康接口参数,只有一个参数m,长成这样应该是被加密了;
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第7张图片
刷新下,发现m一直在变,但后面有一串乱码变化不大;
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第8张图片

用 Chrome 自带的 视图解析 功能解析下url:视图解码后发现是 | 后面跟着一串数值,每次刷新都在小幅上涨,盲猜应该是时间。
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第9张图片

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

关键点定位:

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

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

点击 Elements 跳到页面的源码页,ctrl + f 唤醒搜索框,直接搜索 m=
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第10张图片
Bingo!一发入魂,我们来看看找到了什么
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第11张图片
一个名为 oo0O0 的方法,看起来这个命名不是特别规范;不管他我们之间看变量 m

var m = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",

这个 m 初始值,不是我们要找那个 m ;我们看看下一个
Js逆向 | 猿人学爬虫攻防大赛 | 第一题: js 混淆 - 源码乱码(多图预警!!手把手教学!!)_第12张图片

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 = `
中国联合航空
KN5911波音737(中)

13:50

大兴国际机场

3小时40分钟

17:30

宝安机场

¥price_sole

收起

`
; let choice = [ "中国南方航空", "吉祥航空", "奥凯航空", "九元航空", "长龙航空", "东方航空", "中国国际航空", "深圳航空", "海南航空", "春秋航空", "上海航空", "西部航空", "重庆航空", "西藏航空", "中国联合航空", "云南祥鹏航空", "云南英安航空", "厦门航空", "天津航空", "山东航空", "四川航空", "华夏航空", "长城航空", "成都航空有", "北京首都航空", "中华航空", "意大利国家航空公司", "印度百捷航空", "越南航空", "远东航空", "印度航空公司", "印度捷特航空有限公司", "以色列航空公司", "意大利航空", "伊朗航空公司", "印度尼西亚鹰航空公司", "英国航空公司", "西方天空航空", "西捷航空", "西班牙欧洲航空公司", "西班牙航空公司", "中国南方航空", "吉祥航空", "奥凯航空", "九元航空", "长龙航空", "东方航空", "中国国际航空", "深圳航空", "海南航空", "春秋航空", "上海航空", "西部航空", "重庆航空", "西藏航空", "中国联合航空", "云南祥鹏航空", "云南英安航空", "厦门航空", "天津航空", "山东航空", "四川航空", "华夏航空", "长城航空", "成都航空有", "北京首都航空", "中华航空", "意大利国家航空公司", "印度百捷航空", "越南航空", "远东航空", "印度航空公司", "印度捷特航空有限公司", "以色列航空公司", "意大利航空", "伊朗航空公司", "印度尼西亚鹰航空公司", "英国航空公司", "西方天空航空", "西捷航空", "西班牙欧洲航空公司", "西班牙航空公司", ]; let op = 1; let jic = [ "北京首都国际机场", "上海虹桥国际机场", "上海浦东国际机场", "天津滨海国际机场", "太原武宿机场", "呼和浩特白塔机场", "沈阳桃仙国际机场", "大连周水子国际机场", "长春大房身机场", "哈尔滨阎家岗国际机场", "齐齐哈尔三家子机场", "佳木斯东郊机场", "厦门高崎国际机场", "福州长乐国际机场", "杭州萧山国际机场", "合肥骆岗机场", "宁波栎社机场", "南京禄口国际机场", "广州白云国际机场", "深圳宝安国际机场", "长沙黄花机场", "海口美亚机场", "武汉天河机场", "济南遥墙机场", "青岛流亭机场", "南宁吴墟机场", "三亚凤凰国际机场", "重庆江北国际机场", "成都双流国际机场", "昆明巫家坝国际机场", "昆明长水国际机场", "桂林两江国际机场", "西安咸阳国际机场", "兰州中川机场", "贵阳龙洞堡机场", "拉萨贡嘎机场", "乌鲁木齐地窝堡机场", "南昌向塘机场", "郑州新郑机场", "北京首都国际机场", "上海虹桥国际机场", "上海浦东国际机场", "天津滨海国际机场", "太原武宿机场", "呼和浩特白塔机场", "沈阳桃仙国际机场", "大连周水子国际机场", "长春大房身机场", "哈尔滨阎家岗国际机场", "齐齐哈尔三家子机场", "佳木斯东郊机场", "厦门高崎国际机场", "福州长乐国际机场", "杭州萧山国际机场", "合肥骆岗机场", "宁波栎社机场", "南京禄口国际机场", "广州白云国际机场", "深圳宝安国际机场", "长沙黄花机场", "海口美亚机场", "武汉天河机场", "济南遥墙机场", "青岛流亭机场", "南宁吴墟机场", "三亚凤凰国际机场", "重庆江北国际机场", "成都双流国际机场", "昆明巫家坝国际机场", "昆明长水国际机场", "桂林两江国际机场", "西安咸阳国际机场", "兰州中川机场", "贵阳龙洞堡机场",

你可能感兴趣的:(python,js,javascript)