原文連結: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 釋出!