Hi,大家好伶唯,歡迎大家參閱由IT貓之家精心制作的JS實戰(zhàn)系列教學(xué)課程,我是作者叮當貓世杀,在上期教學(xué)中阀参,我們學(xué)習了如何快速分析基于Header授權(quán)加密協(xié)議,同時我們也初次接觸到了鉤子(hook)的概念瞻坝,鉤子在JS中可以說是較為高級的概念蛛壳,如果大家有在操作系統(tǒng)中使用過鉤子,那么你一定對這個不陌生所刀,在windows中衙荐,我們常用的操作諸如,點擊浮创、拖拽赫模、滑動、或者是輸入蒸矛,這些操作統(tǒng)統(tǒng)都是基于底層API通過發(fā)送消息實現(xiàn)的瀑罗,比如我們要在某編輯框輸入信息,我們會先取得子窗口的句柄(即選中窗體雏掠,按預(yù)定事件是否獲取焦點等)斩祭,然后才能向該句柄發(fā)送text指令,當CPU得到響應(yīng)后會根據(jù)相關(guān)指令完成相應(yīng)的操作乡话,而鉤子在這一發(fā)送的過程中可以作為一個中間人為您監(jiān)聽摧玫、篡改報文、或攔截報文等作用绑青,當然它不是必須的诬像,除非你想要,事實上它就是一種消息中斷機制闸婴,如上述所言坏挠,它可以監(jiān)聽一切傳送的內(nèi)容,那么在JS中邪乍,它的作用也是類似的降狠,今天我們將會學(xué)習如何通過鉤子快速定位到Cookie加密協(xié)議入口,在此之前如果您是第一次觀看本教學(xué)庇楞,歡迎前往:網(wǎng)絡(luò)爬蟲頻道查閱榜配,本期我們就一起來探討下,在日常爬取數(shù)據(jù)的過程中吕晌,當我們遇到Cookie加密授權(quán)時該如何處理蛋褥,我們將以越捷航空官網(wǎng)作為演示的目標,如大家有不懂的歡迎留言睛驳,或加入我們的QQ技術(shù)交流群探討:544185435
【網(wǎng)絡(luò)爬蟲教學(xué)】一分鐘帶你快速尋找JS加密入口-視頻版
由于國內(nèi)頻道遭版權(quán)問題封禁烙心,上傳不了膜廊,所以目前僅上傳Youtube,如需觀看視頻請前往源站:IT貓之家_JS實戰(zhàn)系列之Cookie加密協(xié)議分析
步驟一
需準備Fiddler(抓包用)弃理、Chrome(調(diào)試與分析)
我們打開Fiddler,為了方便我們分析數(shù)據(jù)屎蜓,建議大家配置過濾器痘昌,僅過濾我們需要的信息,如上圖我們將面板切換至Filters項炬转,勾選“Use Filters”旁邊的復(fù)選框辆苔,Hosts選項分別選擇:1. Show only Internet Hosts、2. Show only the following Hosts扼劈;并在編輯框中輸入“*. 要過濾的URL(不包含前綴) ”以分號結(jié)束驻啤,如越捷航空的URL為:?https://www.vietjetair.com/?則規(guī)則應(yīng)寫成:*. vietjetair.com ;意為泛匹配的意思,填寫完畢后點擊右上角的“Changes not yet saved.” 保存荐吵。
步驟二
打開越捷航空官網(wǎng)骑冗、選擇航班進行搜索、通過Fiddler抓包后分析相關(guān)請求先煎,并尋找出攜帶加密Cookie的接口
我們打開越捷航空的官網(wǎng)贼涩,并確定一下Fiddler是否正常能正常過濾出我們預(yù)設(shè)的域名。
隨便輸入航線薯蝎、日期遥倦,這里我們選擇單程,也可以按默認占锯,選擇完畢后點擊查詢航班按鈕袒哥。
點擊跳轉(zhuǎn)后的結(jié)果頁面是這樣的,可能存在跳轉(zhuǎn)中斷問題消略,即跳轉(zhuǎn)后空白無響應(yīng)堡称,這是因為網(wǎng)站監(jiān)測到你的流量異常,重新多試幾遍即可艺演,或者換瀏覽器粮呢。
如果您正確的配置了Fiddler,應(yīng)該會出現(xiàn)如上圖所述的請求鏈接钞艇,也就是說我們要分析的加密就在上述的鏈接之中啄寡。
在分析請求之前,我們必須先找到實際的請求URL有哪些哩照,如果您此前有做過航司爬蟲方面的工作挺物,我相信您肯定一眼就能看出哪個是請求的接口了,這個站的請求接口為:https://booking.vietjetair.com/ameliapost.aspx?lang=zh 我們可以通過Fiddler的WebForms面板查看飘弧,如果您不知道如何找到該面板识藤,請在Fiddler中切換至Inspectors項砚著,它的子菜單欄中就能看到WebForms選項了,通常查詢接口包含始發(fā)站點(通常三字碼)痴昧、到達站點(通常三字碼)稽穆、日期、貨幣赶撰、人的類型(成人/小孩/嬰兒)舌镶、與其它必要數(shù)據(jù);
我們將面板切換至Cookies選項豪娜,通過分析餐胀,我們可以在:https://booking.vietjetair.com/TSPD 開頭的這個請求接口中看到一串已“TSdc75a61a_74”開頭的Cookie,而這串Cookie正是我們本次要分析的目標字段瘤载,當然如果你分析下去后否灾,你會發(fā)現(xiàn),其實這個字段僅僅只是開始而已鸣奔,后面有好幾個類似的字段都需要我們?nèi)ソ饷苣迹晕視赃@個站作為教學(xué)的目標站點,因為它足夠的復(fù)雜挎狸。
步驟三
開啟Chrome Conse健提、嘗試在控制臺中全局搜索與“TSdc75a61a_74” 相關(guān)的請求、通過Mouse斷點進行調(diào)試
跟以往一樣伟叛,我們可以先去嘗試下通過關(guān)鍵詞搜索方式在Chrome控制臺中進行全局匹配私痹,如果您此前還未曾使用過Chrome Console,歡迎查看之前的文章后再回來看统刮,很遺憾紊遵,我們在找遍所有相關(guān)字段后都沒有匹配到一條合適的URL,那么極有可能這個字段名稱是由JS動態(tài)生成的了侥蒙,也就是說暗膜,這條路行不通。
俗話說鞭衩,山路不通走水路学搜,通過上面的判斷,我們知道了Cookie加密的字段名稱極有可能是動態(tài)生成的论衍,所以我們不能使用該方式瑞佩,改用Mouse斷點法測試一下吧!首先我們打開控制臺右側(cè)的“Event Listener Breakpoints”選項坯台,并找到“Mouse”子項炬丸,并在“click”旁邊的復(fù)選框中勾上,用以監(jiān)聽鼠標的點擊事件(這實際上就是一個鉤子蜒蕾,而這個鉤子是Chrome內(nèi)置的)稠炬。
當我們在頁面上點擊查詢航班按鈕后就會發(fā)現(xiàn)網(wǎng)頁被斷了下來焕阿,并沒有繼續(xù)跳轉(zhuǎn),我們點擊上圖指向的花括號首启,用以美化代碼暮屡,讓我們分析起來更清晰些。
在經(jīng)過反反復(fù)復(fù)的嘗試之后毅桃,我們就會發(fā)現(xiàn)褒纲,根本沒法正確命中斷點,換句話說疾嗅,根本不能找到入口外厂,因為這個站的加密在頁面跳轉(zhuǎn)的同時就已經(jīng)刪除了加密代碼冕象,所以一旦跳轉(zhuǎn)代承,我們再也找不到加密的入口。
步驟四
編寫鉤子函數(shù)渐扮,監(jiān)聽Cookie接口信息的收發(fā)论悴、結(jié)合Chrome extension實現(xiàn)信息中斷與攔截機制
在經(jīng)過上述步驟的嘗試,我們總結(jié)出一個結(jié)論墓律,就是每種調(diào)試方式都不是萬能的膀估,它們僅僅只是一種方式,事實上使用Mouse斷點方式確實可行耻讽,只是它需要花費大量的時間去調(diào)試察纯、失敗、調(diào)試针肥,再失敗再調(diào)試饼记,這個過程會讓您調(diào)試到懷疑人生,那我們何不以更取巧的方式來實現(xiàn)曲線救國呢慰枕?答案是肯定的具则,既然這個加密是通過Cookie實現(xiàn)的,那么我們完全可以通過自定義鉤子來監(jiān)聽它具帮,這里要先聲明一點:鉤子也不是萬能的博肋,只有在目標函數(shù)加密時使用到了內(nèi)置函數(shù)才可以使用,比如上一期教學(xué)中的Header授權(quán)加密蜂厅,它采用了setRequestHeader接口匪凡,所以我們可以監(jiān)聽并攔截該接口的收發(fā)信息,同理這里我們也可以監(jiān)聽Cookie的接口掘猿,實現(xiàn)方式也非常的簡單锹雏,如下。
inject.js文件
var code = function(){
var org = document.cookie.__lookupSetter__('cookie');
document.__defineSetter__("cookie",function(cookie){
if(cookie.indexOf('TSdc75a61a')>-1){
debugger;
}
org = cookie;
});
document.__defineGetter__("cookie",function(){return org;});
}
var script = document.createElement('script');
script.textContent = '(' + code + ')()';
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
這里我們重寫了Cookie的lookupSetter接口术奖,當匹配到包含TSdc75a61a的Cookie時礁遵,則直接斷下來轻绞,所以我們要確定被加密的字段會經(jīng)過該接口,方可進行攔截佣耐。
manifest.json 文件
{
? "content_scripts": [ {
? ? ? "js": [ "inject.js"],
? ? ? "matches": [ "http://*/*", "https://*/*","<all_urls>"]
? } ],
? "manifest_version": 2,
? "name": "CookieHook",
? "permissions": ["tabs"],
? "version": "0.1"
}
在完成JS文件的編寫后政勃,我們還需額外聲明一個manifest文件,用以聲明這是一個Chrome extension兼砖,當兩個文件都編寫完成后將其放入一個文件夾中奸远,(兩個文件必須同一目錄),并為目錄取名“CookieHook”讽挟,到此完成擴展的編寫以上僅僅是一個最簡單的案例懒叛,其它功能可自行參考擴展官網(wǎng)教程。
步驟五
啟用CookieHook擴展插件進而捕獲加密數(shù)據(jù)從而實現(xiàn)快速尋找切入口的目的
在chrome的url中輸入:?chrome://extensions/?然后啟用開發(fā)者模式耽梅,點擊加載已解壓的擴展程序薛窥,選擇剛創(chuàng)建的目錄(是目錄),按確定后將會看到如上圖的擴展項眼姐。
回到越捷航空首頁诅迷,并打開控制臺(可按F12喚出),我們再次嘗試輸入航線众旗,然后點擊查找航班罢杉,如無意外,網(wǎng)頁便會斷了下來贡歧,然后我們將鼠標移到cookie中滩租,便可清晰的看到,我們要找的加密字段了利朵。
通過在堆棧中尋找源律想,我們不難發(fā)現(xiàn),它的入口就是:J(Z, _, J)這個函數(shù)哗咆,當然這個函數(shù)是可變的蜘欲,根據(jù)我們分析的規(guī)律,它是間隔2小時更新一次算法晌柬,(應(yīng)該說變更一次模板)如果您看到的跟我的不一樣姥份,請不用懷疑,它就是加密的入口年碘,我們清晰可見:zL這個變量中得到的是字段名“ TSdc75a61a_74 ”那不就是我們要找的么澈歉,從而我們可以證實了這個字段名是動態(tài)生成的想法。
總結(jié)
以上為本期教學(xué)的所有內(nèi)容屿衅,主要講解了如何通過自定義鉤子函數(shù)實現(xiàn)快速尋找加密函數(shù)入口埃难,并且我們也嘗試了通過不同的調(diào)試方式進行定位,需要注意的是,鉤子函數(shù)并非所有場景都能使用涡尘,只有當目標函數(shù)采用了內(nèi)置API才能對其進行監(jiān)聽忍弛,當然這個規(guī)定是死的,事實上我們完全可以通過proxy來實現(xiàn)監(jiān)聽任意函數(shù)而不僅僅只是趨限于內(nèi)置的函數(shù)考抄,大家懂我意思吧细疚?好了,本期教學(xué)到此暫告一段落川梅,咱們下期再見疯兼!