维普期刊 瑞数5
- 鄭重聲明:本項(xiàng)目的所有代碼和相關(guān)文章, 僅用于經(jīng)驗(yàn)技術(shù)交流分享,禁止將相關(guān)技術(shù)應(yīng)用到不正當(dāng)途徑,因?yàn)闉E用技術(shù)產(chǎn)生的風(fēng)險與本人無關(guān)。
加載流程
url:aHR0cDovL2xpYi5jcXZpcC5jb20vUWlrYW4vU2VhcmNoL0luZGV4P2Zyb209aW5kZXg=
簡單說一下瑞數(shù)5代的加載流程,首先打開一個無痕瀏覽器,輸入維普的url ,查看其加載過程
可以看到,當(dāng)在一個干凈的瀏覽器環(huán)境中第一次請求時,會首先返回一個412頁面,這個412頁面又加載了一個js文件,然后才返回了首頁的200頁面,我們可以先觀察兩個 Index?from=index 有什么不同
第一個Index?from=index
第二個Index?from=index
很明顯,他們的不同之處在于cookie,其中GW1gelwM5YZuS是服務(wù)器返回的,而GW1gelwM5YZuT則是js代碼生成的,也就是說我們必須破解GW1gelwM5YZuT的生成過程
定位cookie
定位cookie最快的方式自然是hook了,首先新開一個無痕窗口,然后打一個事件斷點(diǎn),輸入url回車
斷點(diǎn)斷住后,在控制臺注入以下代碼
(function() {'use strict';let hookCookie = function (key) {'use strict';var cookie_str = document.cookie;Object.defineProperty(Document.prototype, 'cookie', {get: function () {return cookie_str;},set: function (val) {console.log('捕獲到cookie設(shè)置-->', val);if (val.indexOf(key) !== -1) debugger;let addCookie = val.split('; ')[0]addCookie = addCookie.split('=')let cookie_object = {}cookie_str.split('; ').map(function (v) {v = v.split('=')cookie_object[v[0]] = v[1]})cookie_object[addCookie[0]] = addCookie[1]let cookie_arr = []for (let k in cookie_object) {k = k + "=" + cookie_object[k] + '; 'cookie_arr.push(k)}cookie_str = cookie_arr.join('')return cookie_str}}); } hookCookie('GW1gelwM5YZuT'); })();斷點(diǎn)斷住后,跟棧調(diào)試
通過跟棧找到cookie生成位置,這是個vm文件,一般這種文件都是eval生成的
繼續(xù)跟棧到412頁面,找到eval函數(shù),其中_$FP就是vm中的代碼
跟到這里,我們已經(jīng)知道cookie生成的大致流程了,當(dāng)不攜帶cookie訪問首頁時,服務(wù)器返回一個412頁面,412頁面會執(zhí)行了一些js代碼,生成了_$FP(字符串類型的js代碼),然后調(diào)用eval函數(shù)將_$FP給執(zhí)行了,生成了vm文件,vm文件執(zhí)行后生成了cookie。
扣代碼
紅色標(biāo)注的位置全部都要扣下來
補(bǔ)環(huán)境
在瑞數(shù)的代碼還未執(zhí)行eval之前,可以使用proxy代理補(bǔ),在執(zhí)行eval后就不能使用proxy了,為什么不能使用了,懂的都懂,既然不能使用proxy了,那我怎么知道他檢測了那些環(huán)境呢,其實(shí)很簡單,就像華為牛過河的面試題的答案一樣,他是直接過,我是直接調(diào),兩個字:硬剛
-
第一步復(fù)制剛才那份412頁面的所有代碼,保存到本地為rs.html(記住代碼不要格式化)
-
第二步在rs.html的頭部加入以下代碼,這么做是為什么,大家應(yīng)該懂我意思吧
<script>eval_= eval;eval = function(s){debugger;return eval_(e)}eval.toString = function(){return 'function eval() { [native code] }'}// 保持環(huán)境的一致性Object.defineProperty(window,'indexedDB',{ger(){return underline;}}) ......</script> -
第三步,使用fiddler本地替換,當(dāng)斷點(diǎn)斷住之后,直接調(diào)試就可以了,看他檢測了什么就補(bǔ)什么(有一些是可以不補(bǔ)的,這就要看你對瀏覽器的了解了)
-
至于怎么調(diào)試最快最有效就是基礎(chǔ)知識了,如果你調(diào)試技巧足夠嫻熟,一天就能補(bǔ)出所有環(huán)境,當(dāng)然后續(xù)還有很多坑
-
可以參考挽風(fēng)大佬的文章
如果你自己生成的cookie有173位了,那你因該可以拿到首頁的200,如果生成的cookie有279位(記得模擬load事件執(zhí)行),則可以拿到搜索接口的200,記住cookie的時效性非常短,如果你想在node中生成,然后復(fù)制到python腳本中去請求是行不通的。
搜索接口后綴生成
在搜索接口有一個后綴,他其實(shí)是重寫了XMLHttpRequest.prototype.open方法,只要你調(diào)用這個方法,就會自動為url加上后綴
如果你生成的cookie沒問題的話,你可以直接用proxy代理出后綴生成的檢測點(diǎn)
成果展示
總結(jié)
- 上一篇: 【模式匹配】之 —— KMP算法详解及证
- 下一篇: 学习笔记 | 如何将 MathType