概要

提示:仅供学习,不得用做商业交易,如有侵权请及时联系

逆向:JS逆向 - Akamai阿迪达斯(三次) 补环境、纯算

URL:aHR0cHM6Ly93d3cuYWRpZGFzLmNvbS5jbi8=

整体架构流程

提示:分析整体流程

1、访问首页

在这里插入图片描述

  1. 会发三次包:第二次发包是事件触发,不用管,第三次是轨迹达到21次触发:POST =》sensor_data
  2. 我们可以XHR断点,然后往回跟栈
  3. js混淆还原(墨竹大佬的还原脚本)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2、din对象的键值的顺序是每次都变的,ajr的值算法也是会变的,dvc的值是vmp的算法固定(b+j+g+i+e+h+c+k+l+d+f+动态的),mev的值则是轨迹计算得到的

3、扣算法(第三次接口返回的cookie里面:0)

在这里插入图片描述

技术名词解释

提示:补环境

  1. 描述符检测:
Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor() {
    if (arguments[1] === 'contentWindow') {
        contentWindow_getter = function contentWindow() { }
        contentWindow_getter.toString = function toString() {
            return "function get contentWindow() { [native code] }"
        }
        return {
            get:contentWindow_getter
        }
    }
    if (arguments[1] === 'loading') {
        loading_getter = function loading() { }
        loading_getter.toString = function toString() {
            return "function get loading() { [native code] }"
        }
        return {
            get:loading_getter
        }
    }
    if (arguments[0] === navigator.__proto__ && arguments[1] === 'plugins') {
        plugins_getter = function plugins() { }
        plugins_getter.toString = function toString() {
            return "function get plugins() { [native code] }"
        }
        return {
            get:plugins_getter
        }
    }
    if (arguments[0] === navigator.__proto__ && arguments[1] === 'mimeTypes') {
        mimeTypes_getter = function mimeTypes() { }
        mimeTypes_getter.toString = function toString() {
            return "function get mimeTypes() { [native code] }"
        }
        return {
            get:mimeTypes_getter
        }
    }
    if (arguments[1] === 'path') {
        return undefined
    }
    if (arguments[1] === 'createElement') {
        return undefined
    }
    return Object.getOwnPropertyDescriptor_.apply(this,arguments);
}
  1. SharedWorker检测:onmessage的回调
Object.defineProperty(wroker_port, 'onmessage', {
        set: function (value) {
            debugger
            value({
                data:{
                    "ts": (new Date(window.bmak.startTs+1000)).toString(),
                    "oscpu": null,
                    "tz": "Asia/Shanghai",
                    "la": navigator.language,
                    "las": navigator.languages,
                    "dm": navigator.deviceMemory,
                    "hc": navigator.hardwareConcurrency,
                    "net": [
                        navigator.connection.effectiveType,
                        -1,
                        "null"
                    ],
                    "ua": navigator.userAgent,
                    "av": navigator.appVersion,
                    "pl": "xxx",
                    "uad": {
                        "architecture": "xxx",
                        "bitness": "xxx",
                        "brands": xxx,
                        "fullVersionList": xxx,
                        "mobile": false,
                        "model": "",
                        "platform": "xxx",
                        "platformVersion": "10.0.0",
                        "uaFullVersion": "xxx",
                        "wow64": false
                    },
                    "gpu": {
                        "gpuVendor": "xxx",
                        "gpuRenderer": "xxx",
                        "gpu2Vendor": "xxx",
                        "gpu2Renderer": "xxx"
                    }
                }
            })
        }
    })
  1. speechSynthesis.getVoices检测:第一次返回的是空,第二、三次返回的有值voiceURI、lang
  2. 各种原型链检测、toString检测、navigator的属性回调检测、plugins的原型+item、refresh
  3. document.cookie里面必须带有首页返回的bm_sz、document.currentScript必须是第一次返回的js的url、等等
    在这里插入图片描述

小结

提示:学习交流主页,星球持续更新中:(+星球主页+v)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐