原文鏈接:https://mp.weixin.qq.com/s/NJjU7dqA1g0-_xFmr1nrIg
前言
上一篇文章測試了多個補環(huán)境的框架(多個開源的js補環(huán)境框架測試),這篇來說一下具體怎么補。用__ac_signature
做測試锄奢,這個相對簡單一點飘蚯。
逆向
先定位cookie生成的位置,清空cookie然后刷新網(wǎng)頁爽雄,可以看到有兩次請求。第一次返回了一個__ac_nonce
的cookie骡尽,未攜帶__ac_signature
及穗。第二次就已經(jīng)帶上了這個cookie暗膜,那肯定是之前請求里的js加上的。
看了下中間的幾個請求都不是js蛔翅,只有可能是在第一次請求返回的內(nèi)容敲茄,不過谷歌瀏覽器看不到響應內(nèi)容,只能用抓包工具或者火狐看山析。
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
爽待,不需要去分析里面做了,直接拿出來整個補環(huán)境翩腐。
補環(huán)境框架
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("運行環(huán)境Js + 工作Js 耗時:", +new Date - a, "毫秒");
}
test_vm();
然后把js放到./work/ac_sign.js
里,在終端輸入.\node main.js
就會吐出所有的環(huán)境等龙,結果也輸出出來了
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)
驗證有效性
能生成結果肯定是不夠罐栈,還得能出數(shù)據(jù)才行∧喑看了一下荠诬,發(fā)現(xiàn)cookie中的__ac_signature
其實是可有可無的。如果你直接修改cookie來驗證的話位仁,也是能返回內(nèi)容的柑贞。
__ac_signature
的實際作用是為了得到ttwid,如果__ac_signature
有效聂抢,第二次請求就會在響應頭加一個set-cookie設置ttwid的值钧嘶,這個值才是后面需要用到的cookie值。
所以在charles修改第二次請求的__ac_signature
琳疏,看看服務器返回的有沒有set-cookie有决。如果沒有的話,說明觸發(fā)風控了(驗證碼)空盼,可能是__ac_signature
無效书幕,也可能是請求太多次了。
失敗的請求:
成功的情況:
測試了下上面兩個框架生成的__ac_signature
都可以得到ttwid我注,也就是說環(huán)境都是通過了網(wǎng)站的檢測按咒。
補環(huán)境
既然都把環(huán)境吐出來,我還想手動補一下環(huán)境,補完發(fā)現(xiàn)壓根通不過驗證励七,檢測的東西太多了智袭。即使環(huán)境都補對了而且能在vm2里運行,在node和chakracore里的結果也通不過檢測掠抬。
還是直接站在巨人的肩膀上開個服務調用吧吼野,這樣可以不用折騰那么多事。