zoukankan      html  css  js  c++  java
  • 这个美团酒店爬虫JS逆向解密,你不得不尝

    前面几期抠的JS代码都比较简单,这期要扣的就相对要难一些了,建议亲自尝试,不过依然有完整JS代码,获取完整代码方式见文末。

    前言

    某天看到有外卖员三问王兴,你敢信,那天我居然兴趣突发,想看看美团加密方式是什么,随即打开美团酒店传送门在这
    在这里插入图片描述

    调试

    挠头调试

    按下F12顺便刷新一下页面,看一看都发了什么请求,呼呼啦啦的一堆请求,点击一下XHR只看ajax请求(毕竟这些大公司都是前后端分离,数据均靠ajax方式传输),倒是少了不少请求,这时候发现有大量的service开头的请求,点进去看一看,发现每一个请求里有一个酒店的信息,如下图:
    在这里插入图片描述
    哈哈,那接下来套路我们不都知道了,
    在这里插入图片描述
    先去请求url里看看都有什么参数:
    在这里插入图片描述
    看起来也就一个X-FOR-WITH需要抠一下代码,还不简单,扔到Sources里找一找,那不得百分百找到???
    在这里插入图片描述

    啊?纳尼。没有???
    在这里插入图片描述
    这可如何是好
    在这里插入图片描述
    片刻后,突然想到是不是可以从调用栈进去看看:
    在这里插入图片描述
    随便点一个进去,进入到一个VM后其实也没有头绪,该从何入手呢?这时就想到既然是ajax请求获得的数据,那我不就可以依靠捕捉ajax请求设置断点了,这个方法前面没提过,直接看下图设置:
    在这里插入图片描述
    去复制刚才service请求里的几个关键url词:
    在这里插入图片描述
    这时候继续刷新页面就跳转到下面了:
    在这里插入图片描述
    wc,没思路了,我当时在这里跌跌撞撞了很久,调试了很久才发现了一点端倪,兜兜转转半天发现一切隐藏在apply函数前面if语句中的i[r]:
    在这里插入图片描述

    点开i看看代码在哪里:
    在这里插入图片描述
    就跳到了hookAjax里:
    在这里插入图片描述
    既然到这里了,那大致也确定所需要的都在这里了,不过到现在还是没有发现X-WITH-FOR的踪影,别急,开始无穷无尽的调试吧,经过一番令人不适的调试后,还是有点起色了,给大家提个小建议,遇到这种目的虚无缥缈的调试优先点进函数看看,比如 var t = p(w);,不清理缓存的话不一定每次都能进入这个函数,假如你点进去看看就会发现很熟悉,不用怕,调试状态也能进去:

                var p = function(e) {
                    v(e);
                    e.cts = (new Date).getTime();
                    var r = JSON.stringify(e);
                    var t = window["metaIdx"];
                    var n = releasex.util.convertStringToBytes(t);
                    var i = releasex.util.convertStringToBytes(t);
                    var o = releasex.util.convertStringToBytes(r);
                    var a = releasex.padding.pkcs7.pad(o);
                    var u = new releasex.ModeOfOperation.cbc(n,i);
                    var c = u.encrypt(a);
                    var f = s(c);
                    return f
                };
    

    插曲(几个参数介绍)

    其中e长这样:
    在这里插入图片描述

    JSON.stringify(e)后长这样:

    "{"ts":1598622575690,"cts":1598625557233,"brVD":[1920,423],"brR":[[1920,1080],[1920,1040],24,24],"aM":"","code":"20200828168048912-4581810-KhhOliZQKTvcGeO"}"
    

    tscts不用说了,都是时间戳,brVDbrR对应下面四个值,都是与屏幕有关的,可以算是固定的,aM为空:
    在这里插入图片描述
    code的生成方式如下,算是有变化的,每一次打开页面V函数里的几个字符串都不一样的,这点需要注意:
    在这里插入图片描述

    继续调试

    看见new releasex.ModeOfOperation.cbc(n,i);encrypt是不是有点感觉,cbc这不就是rsa加密吗?这里肯定有端倪。一路调试到var c = u.encrypt(a)
    在这里插入图片描述
    继续下来到var f = s(c);
    在这里插入图片描述
    看这加密结果与url里的X-WITH-FOR对比貌似有点像,继续调试,结果一次encodeURIComponent。一步一步运行,跑到了一个平平无奇的函数里,看起来也做了一些操作:
    在这里插入图片描述
    其实到这里已经有点困了,很想去开一局帝国时代,但是还是忍住了,点点点,突然发现:
    X-WITH-FOR
    功夫不负有心人,还好没打开steam,这藏得可够深啊老铁。
    在这里插入图片描述更明显的看这里:
    在这里插入图片描述
    这不就是我们的X-WITH-FOR么,ok了。
    在这里插入图片描述

    一些提示

    调试过程中我略过了一些不太重要的部分,大家可以看一下e:

    {"ts":1598535241135,"cts":1598536559784,"brVD":[1920,530],"brR":[[1920,1080],[1920,1040],24,24],"aM":"","code":"20200827169606326-3603852-eSBufuUUYnDnmatVKF"}
    

    在这里插入图片描述

    抠出来运行

    老规矩、老代码:

    import execjs
    import requests
    import json
    
    ##获取X-WITH-FOR
    with open('..//js//meituan.js', encoding='utf-8') as f:
        meituan = f.read()
    js = execjs.compile(meituan)
    data ={"ts":1598535241135,"cts":1598536559784,"brVD":[1920,530],"brR":[[1920,1080],[1920,1040],24,24],"aM":"","code":"20200827169606326-3603852-eSBufuUUYnDnmatVKF"}
    logid = js.call('gt', data)
    print(logid)
    
    url = "https://ihotel.meituan.com/group/v2/poi/detail/service?utm_medium=pc&version_name=999.9&poiId=2386321&X-FOR-WITH={}".format(logid)
    headers = {
        "Host": "ihotel.meituan.com",
        "Origin": "https://hotel.meituan.com",
        "Referer": "https://hotel.meituan.com/shanghai/",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36",
    }
    
    #获取酒店列表
    rsp = requests.get(url,headers=headers)
    #rsp_json = json.dumps(rsp.text,indent=3,ensure_ascii=False)
    print(rsp.text)
    

    运行一下看看:
    在这里插入图片描述
    缺少window,那还不简单 ,像往常一样直接定义一个window={},继续运行:
    在这里插入图片描述
    ???????
    啥情况,定义成window={}这样不行?结果一番百度,发现nodejs有一个库jsdom,可以模拟浏览器生成windowdocument对象。这样使用:

    const jsdom = require("D:\nodejs\node_modules\jsdom");
    const {JSDOM } = jsdom; //在jsdom中导出JSDOM对象
    const { window } = new JSDOM('<!doctype html><html><body></body></html>'); //导出JSDOM中的window对象
    global.window = window; //将window对象设置为nodejs中全局对象;
    function aa()
    {
       	console.log(window)
    }
    aa()
    

    测试运行,生成window对象:
    在这里插入图片描述
    看来是可以,那就用在我们js代码里生成window对象,继续运行:
    在这里插入图片描述

    哎呦,不错哟!

    结束

    调试稍微有些难度的网站基本就要很有耐心了,准备好无限调试的准备,还需要继续加强调试技巧啊。

    代码获取方式

    写了很多,关注的不多,越来越缺少动力了,后面还有网易云JS逆向和滑块逆向,如果对大家有帮助的话麻烦先关注知识图谱与大数据公众号,点击文末阅读更多阅读更多、阅读更多获取JS源码吧,当然不关注也无所谓,有问题随时私信。
    公众号

  • 相关阅读:
    namespace
    kubernetes环境搭建
    verdaccio私有仓库搭建
    mysql中间件proxysql
    MySQL存储引擎
    关于分布式系统
    转载:ETL讲解
    用原生JS 写Web首页轮播图
    javascript——记忆小便签
    转载:JavaScript 的 this 原理
  • 原文地址:https://www.cnblogs.com/luohua13950/p/13622995.html
Copyright © 2011-2022 走看看