js逆向) 某音cookie中的__ac_signature

Python成长路發表於2024-05-10

原文連結:https://mp.weixin.qq.com/s/NJjU7dqA1g0-_xFmr1nrIg

前言

上一篇文章測試了多個補環境的框架(多個開源的js補環境框架測試),這篇來說一下具體怎麼補。用__ac_signature做測試,這個相對簡單一點。

逆向

先定位cookie生成的位置,清空cookie然後重新整理網頁,可以看到有兩次請求。第一次返回了一個__ac_nonce的cookie,未攜帶__ac_signature。第二次就已經帶上了這個cookie,那肯定是之前請求裡的js加上的。

看了下中間的幾個請求都不是js,只有可能是在第一次請求返回的內容,不過谷歌瀏覽器看不到響應內容,只能用抓包工具或者火狐看。

html裡面有兩個script標籤,第一個裡面就是核心的js,第二個script裡是呼叫和複製cookie。裡面有用的就兩行

window.byted_acrawler.init({
    aid: 99999999,
    dfp: 0
});
var __ac_signature = window.byted_acrawler.sign("", __ac_nonce);

而第一段js程式碼裡就是在定義window.byted_acrawler,不需要去分析裡面做了,直接拿出來整個補環境。

補環境框架

node-sandbox

先測試下node-sandbox。這裡再複述一下使用方法,先把原始碼下載到本地。解壓node.zip到當前目錄,在main.js裡增加下面的程式碼:

function test_vm() {
    const sandbox = {
        wanfeng: wanfeng,
        globalMy: globalMy,
        console: console,
    }
    let workCode = fs.readFileSync("./work/ac_sign.js");
    a = +new Date;
    var callCode = `window.byted_acrawler.init({
        aid: 99999999,
        dfp: 0
    });
    var __ac_nonce = "06639eaa4009ab37b9a75";
    var __ac_signature = window.byted_acrawler.sign("",__ac_nonce);
    console.log("__ac_signature: ", __ac_signature)`;
    var code = "debugger;\r\n" + globalMy_js + init_env + envCode + "\r\n" + workCode + "\r\n" + endCode + callCode;
    vm.runInNewContext(code, sandbox);
    console.log("執行環境Js + 工作Js 耗時:", +new Date - a, "毫秒");
}
test_vm();

然後把js放到./work/ac_sign.js裡,在終端輸入.\node main.js就會吐出所有的環境,結果也輸出出來了

qxVm

qxVm用起來也是類似,改一下js檔名和userAgent、href等,完整程式碼如下:

const fs = require('fs');
const QXVM_GENERATE = require('../qxVm_sanbox/qxVm.sanbox');

function ReadCode(name, dir) {
    let file_path = dir === undefined ? `${__dirname}/${name}` : `${__dirname}/${dir}/${name}`;
    return fs.readFileSync(file_path) + "\r\n"
}

const js_code = ReadCode(`./ac_sign.js`);

const user_config = {
    isTest: false,
    runConfig: { proxy: true, logOpen: true},
    window_attribute: {},
    env: {
        navigator: {
            userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
        },
        location: {
            href: "打碼處理"
        },
        document: {
            referrer: "打碼處理",
            cookie: ''
        }
    }
}
// 幫助資訊列印
// QXVM_GENERATE.help()

let result = QXVM_GENERATE.sanbox(js_code, "get_ac_sign", user_config, false);
let ac_sign = result.get_ac_sign("0663c24340045271d4894")
console.log("__ac_signature:", ac_sign)

驗證有效性

能生成結果肯定是不夠,還得能出資料才行。看了一下,發現cookie中的__ac_signature其實是可有可無的。如果你直接修改cookie來驗證的話,也是能返回內容的。

__ac_signature的實際作用是為了得到ttwid,如果__ac_signature有效,第二次請求就會在響應頭加一個set-cookie設定ttwid的值,這個值才是後面需要用到的cookie值。

所以在charles修改第二次請求的__ac_signature,看看伺服器返回的有沒有set-cookie。如果沒有的話,說明觸發風控了(驗證碼),可能是__ac_signature無效,也可能是請求太多次了。

失敗的請求:

成功的情況:

測試了下上面兩個框架生成的__ac_signature都可以得到ttwid,也就是說環境都是透過了網站的檢測。

補環境

既然都把環境吐出來,我還想手動補一下環境,補完發現壓根通不過驗證,檢測的東西太多了。即使環境都補對了而且能在vm2裡執行,在node和chakracore裡的結果也通不過檢測。

還是直接站在巨人的肩膀上開個服務呼叫吧,這樣可以不用折騰那麼多事。

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章