【JS逆向】之動態cookie
阿新 • • 發佈:2021-07-05
這類反爬比起前篇講的加速樂簡單很多,筆者遇到的網站的cookie由兩個引數組成,即從返回的js中,將這兩個cookie引數找出。
如下圖,是該網站返回內容,一眼可以看到document.cookie,熟悉的應該都知道,這段js可以生成我們所需要的cookie。
將程式碼複製到webstom中,新建html檔案,將其格式化,並將JS程式碼提取出來,並對其進行分析清洗(去除無效引數函式等)
改動前js:
!function () { var o = "00000000ba3dc2781e265cb031f086a4c2e00e2c4a686a4c2e00e2c4a688"; functionk(e, t) { var o = new Date; o.setTime(o.getTime() + 864e5), document.cookie = e + "=" + escape(t) + ";expires=" + o.toGMTString() + ";path=/" } function e(e, t) { return parseInt(e + "", t).toString(16) } function t() {var e = window.OfflineAudioContext || window.webkitOfflineAudioContext; if (null == e) return "nt"; var t = new e(1, 44100, 44100), n = t.createOscillator(), o; n.type = "triangle"; o = t.createDynamicsCompressor(); void 0 !== o.ratio && "function" == typeofo.ratio.setValueAtTime && o.ratio.setValueAtTime(12, t.currentTime), n.connect(o), o.connect(t.destination), n.start(0), t.startRendering(), t.oncomplete = function () { var e; try { e = 1838.1212, n.disconnect(), o.disconnect() } catch (t) { return t } return e } } var n, a, l, d, u, x, i = "5df3dc4b7aaea8a", r = "VudF9fX19lEVENT"; k(i, o); l = document.documentMode || "nt" !== t() ? "1" : "0", d = "nt" === (window.screen.colorDepth || "nt") ? "0" : "1", u = o.slice(o.length - 4), a = e(l + d + "11", 2) + "fffffff"; for (var s = o.slice(o.length - 8), m = "", w = 0; 8 > w; w++) m += e("0x" + a.charAt(w) ^ "0x" + s.charAt(w), 10); k(r, u + m), window.location.reload() }()
分析時先整體看一遍,再看情況打斷點。從下圖幾行程式碼,可以看出其是生成cookie的關鍵所在。第一行很明顯是告訴我們兩個cookie引數的鍵名是什麼。
k(i, o);該行程式碼很明顯是第一個引數的生成過程,此時可以在k函式處打斷點,通過除錯發現呼叫前後o的值不變,故第一個引數就是o,我們可以通過正則
來提取。(在除錯的過程中會發現,document is not defined錯誤,此時補上doucment={};即可)
第三行程式碼看起來挺複雜,但是我們不用管太多,打斷點除錯即可。除錯發現缺少windows環境,由於我們使用的是nodejs,很明顯是缺少環境的,我們可
以去瀏覽器console處去除錯。
將其替換成undefined,此時l的結果已經顯而易見,JS中||只要有一個為True,結果就是True,即l="1",此時t函式也可以直接刪除。
d的除錯結果是1,將js中對應程式碼替換成"1"。
下面u和m很明顯是nodejs可以執行的,所以可以不用管(第四行也是如此)。
k(r,u+m)很明顯是第二個引數的生成過程,並且就是u+m的值
最後window.location.reload()是過載程式碼,可以直接註釋
最終改動後js如下所示:
// !function () { //!表示構建一個立即執行函式 var o = "00000000ba3dc2781e265cb031f086a4c2e00e2c4a686a4c2e00e2c4a688"; //第一個cookie引數 document = {}; //除錯發現document未定義,補全 //第一個引數生成函式,呼叫前後不變 // function k(e, t) { // var o = new Date; // o.setTime(o.getTime() + 864e5), document.cookie = e + "=" + escape(t) + ";expires=" + o.toGMTString() + ";path=/" // } function e(e, t) { return parseInt(e + "", t).toString(16) } // function t() { // var e = window.OfflineAudioContext || window.webkitOfflineAudioContext; // if (null == e) return "nt"; // var t = new e(1, 44100, 44100), n = t.createOscillator(), o; // n.type = "triangle"; // o = t.createDynamicsCompressor(); // void 0 !== o.ratio && "function" == typeof o.ratio.setValueAtTime && o.ratio.setValueAtTime(12, t.currentTime), n.connect(o), o.connect(t.destination), n.start(0), t.startRendering(), t.oncomplete = function () { // var e; // try { // e = 1838.1212, n.disconnect(), o.disconnect() // } catch (t) { // return t // } // return e // } // } function aa() { var o = "00000000b9c7f73b9698498a498ac5e781a34d6f092b2e086a44a680e2cc"; l = '1', d = '1', u = o.slice(o.length - 4), a = e(l + d + "11", 2) + "fffffff"; for (var s = o.slice(o.length - 8), m = "", w = 0; 8 > w; w++) m += e("0x" + a.charAt(w) ^ "0x" + s.charAt(w), 10); return u + m } //window.location.reload() // }()
相關爬蟲程式碼:
def parse_cookie(self, response): cookie1 = re.findall(r'o="(.*?)"', response.text)[0] cookie_js = """ function e(e, t) { return parseInt(e + "", t).toString(16) } function aa() { var o = "00000000b9c7f73b9698498a498ac5e781a34d6f092b2e086a44a680e2cc"; l = '1', d = '1', u = o.slice(o.length - 4), a = e(l + d + "11", 2) + "fffffff"; for (var s = o.slice(o.length - 8), m = "", w = 0; 8 > w; w++) m += e("0x" + a.charAt(w) ^ "0x" + s.charAt(w), 10); return u + m } """ js_result = pyv8_engine_service(cookie_js,functionName='aa') cookie = "5df3dc4b7aaea8a=" + cookie1 + ";" + "VudF9fX19lEVENT=" + js_result self.headers["cookie"] = cookie