JS逆向:記一次QN網(wǎng)摳代碼補瀏覽器環(huán)境

目標(biāo)QN網(wǎng)pre參數(shù)着绊。
第一步钞瀑,先抓包:

可以看到pre參數(shù)熄守。全局搜索url:api/domestic/wbdflightlist铸豁。跟蹤到這里:
可以看到pre的賦值灌曙,來自于window.pt〗诮妫控制臺打印一下:
與上面的pre參數(shù)相吻合在刺。查找pt的賦值:
并沒有找到,看來是被混淆了头镊。寫個腳本hook一下蚣驼,如果捕捉到window.pt賦值,則會觸發(fā)debugger斷在這里相艇,同時我們也可以觀察到賦值的調(diào)用棧颖杏。
這里我嘗試了控制臺輸入hook與油猴腳本hook,都沒有hook到坛芽。最后用Fiddler注入成功hook到了位置留储。猜測是執(zhí)行的順序問題。
可以看到這段JS來自于html內(nèi)
在網(wǎng)頁源代碼中也是找到了這樣一段代碼:
混淆過的靡馁,用AST簡單還原一下欲鹏。
具體操作在我之前的文章中有提到,代碼都差不多臭墨,這次并沒有在反混淆上細(xì)摳赔嚎。代碼也不多了,分析一下唄胧弛。首先window.pt是有的:
里面有很多try catch
我們需要先去掉尤误,否則報錯都不知道哪里。去掉之后運行:
對著錯誤一層一層向上去找结缚,最后定位到這:
我怎么感覺這里的套路這么眼熟呢损晤,好像在之前處理V5的時候遇到過。讓我翻一翻红竭。尤勋。

果然之前遇到過這個套路喘落,那就是檢測換行唄,又想讓我爆內(nèi)存是吧最冰。不會上當(dāng)了瘦棋。我們先把這個地方的代碼挖出來分析分析:

var _0xa5ad5c = _0x2444db(this, function () {
        var _0x35d02e = function () {
          return "dev";
        },
            _0x18cced = function () {
          return "window";
        };
  
        var _0x364152 = function () {
          var _0x1d4f26 = new RegExp("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}");
  
          return !_0x1d4f26.test(_0x35d02e.toString());
        };
  
        var _0xcfd92 = function () {
          var _0x55eb7e = new RegExp("(\\\\[x|u](\\w){2,4})+");
  
          return _0x55eb7e.test(_0x18cced.toString());
        };
  
        var _0x34c898 = function (_0x31b9ac) {
          var _0x35b4e0 = 0;
  
          if (_0x31b9ac.indexOf(false)) {
            _0x3217e1(_0x31b9ac);
          }
        };
  
        var _0x3217e1 = function (_0x4a8870) {
          var _0xbd3fa8 = 3;
  
          if (_0x4a8870.indexOf("true"[3]) !== 3) {
            _0x34c898(_0x4a8870);
          }
        };
  
        if (!_0x364152()) {
          if (!_0xcfd92()) {
            _0x34c898("indеxOf");
          } else {
            _0x34c898("indexOf");
          }
        } else {
          _0x34c898("indеxOf");
        }
      });

他把_0x35d02e和_0x18cced這兩個方法轉(zhuǎn)成字符串后用正則匹配,如果有匹配不到的參數(shù)暖哨,那就調(diào)用_0x34c898("indеxOf")無限循環(huán)赌朋。他是在檢測代碼是否被格式化,在網(wǎng)頁中加載的代碼是被壓成一行的篇裁,如果匹配到了換行\(zhòng)n沛慢,那就代表著代碼被人挖出來格式化了。我們直接把調(diào)用的地方注了达布。

然后就是開始補環(huán)境了团甲,對著報錯的地方去原網(wǎng)頁里找。

諸如此類往枣,他要什么伐庭,我們給什么就是。上個最后補完的結(jié)果:
        local_storeage = {}
        var location = {
            href: "https://flight.qunar.com/site/oneway_list.htm?searchDepartureAirport=%E5%8C%97%E4%BA%AC&searchArrivalAirport=%E6%98%86%E6%98%8E&searchDepartureTime=2020-09-17&searchArrivalTime=2020-09-15&nextNDays=0&startSearch=true&fromCode=BJS&toCode=KMG&from=tejia_d_search&lowestPrice=null",
            host: "flight.qunar.com",
            hostname: "flight.qunar.com"
        };
        var localStorage = {
            setItem: function (key, value) {
                local_storeage[key] = value;
            },
            getItem: function (key) {
                return local_storeage[key]
            },
            removeItem: function (key) {
                delete local_storeage[key]
            }
        }
        var window = {
            location: location,
            localStorage: localStorage
        };
        var document = {
            createElement: function (ele) {
                var element = {
                    src: ""
                }
                return element
            },
            head: {
                getElementsByTagName: function(ele) {
                    if (ele == 'script') {
                        return [
                            {src:"https://rmcsdf.qunar.com/api/device/answer.json?callback=callback_1600070190853&sessionId=c922434c-d559-41e3-9cd8-18a493694dcd&answer=cv3I1H8GFcflk_IfUTmRSv6L-h0klNJrF0SPmn80HJvlkR4qFyTDyP87A4OilQprGfjSsHs8IFr15J5rQejSwKc9JF-llFpuQGyVw39LT_L2qd1bVrnIcixPSoK2g5I_7OyIEjh0x1-ku5HqLy2GceBPUsK3q91bMn3IjzRPXEgjdA4dKryUnyBOTEw2aUYuVrCUyOrRWsa1wBVbGnnG1ihPFoq2sJlaF2zUtn8HKwK2r9ldLvnGc2c8B50kA4Ix7aSNq-c90BRdLcG5OzXJg2x07VhiaYnuIujYOzROKha3lgIyMv3I7L6-ZF-jlgIyMb3UzTc9MFPdgd5wQzzJwfA0Y5Kjqxob77zX1Pc9V5OjtoJt7r3JcihRTwq3v91bOrXEm2RPKk623RYa0miGyqR6ZsP1gQIaQ7WIheMP-_KidcldBe3V"},
                            {src:"https://rmcsdf.qunar.com/api/device/challenge.json?callback=callback_1600070190262&sessionId=c922434c-d559-41e3-9cd8-18a493694dcd&domain=qunar.com&orgId=ucenter.login"},
                            {src:"https://webresource.c-ctrip.com/resaresonline/risk/ubtrms/latest/default/chlorofp.js?siteId=c7e55b219200&v=120-8-14"},
                            {src:"https://ws.qunar.com/rt_recommend?count=3&fromCity=%E5%8C%97%E4%BA%AC&toCity=%E6%98%86%E6%98%8E&depDate=2020-09-17&includeTax=0&callback=jsonp_1417whnctfho9p1"},
                            {src:"https://gw.flight.qunar.com/api/f/priceCalendar?dep=%E5%8C%97%E4%BA%AC&arr=%E6%98%86%E6%98%8E&days=&priceType=1&callback=jsonp_93vaq0viqu3rssh"},
                            {src:"https://lp.flight.qunar.com/api/dom/recommend/nearby_route?from=%E5%8C%97%E4%BA%AC&to=%E6%98%86%E6%98%8E&start_date=2020-09-17&callback=jsonp_qjqv30fbv34guzw"},
                            {src:"https://flightopdata.qunar.com/vataplan?&id=41&callback=jsonp_p5udnewvxw1uvfq"},
                            {src:""},
                            {src:""},
                            {src:""},
                            {src:"https://a.qunar.com/vataplan?framId=a_listBannerTop&vataposition=QNR_OQ==_CN&tag=0&rows=3&cur_page_num=0&rep=1&f=s&callback=QNR._AD.a_listBannerTop&ab=b&tile=16000701898246186355&vatafrom=%E5%8C%97%E4%BA%AC&vatato=%E6%98%86%E6%98%8E"}
                        ]
                    } 
                }
            },
            getElementsByTagName: function(ele) {
                if (ele == 'meta') {
                    return {
                        description: {
                            content: "去哪兒(Qunar.com)作為全球最大的中文旅游搜索引擎,通過對機票,酒店,旅游線路的整合與發(fā)布,提供專業(yè)分冈、實時圾另、可信的旅游產(chǎn)品價格比較與服務(wù)比較系統(tǒng),幫助消費者輕松進(jìn)行充分選擇,是您預(yù)訂機票、酒店雕沉、旅游線路的最佳選擇!"
                        }
                    }
                }
            }

        }

這里有些方法比如getElementsByTagName集乔、localStorage.setItem等是Node里沒有的,這些可以用一些巧妙的方法處理坡椒,說到底他不就是要驗證瀏覽器環(huán)境嗎扰路,離不開一句話,他要什么倔叼,我們給什么汗唱。

node環(huán)境運行結(jié)果:

瀏覽器運行結(jié)果:

一樣,通關(guān)丈攒!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哩罪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子巡验,更是在濱河造成了極大的恐慌际插,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件显设,死亡現(xiàn)場離奇詭異框弛,居然都是意外死亡,警方通過查閱死者的電腦和手機捕捂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門瑟枫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斗搞,“玉大人,你說我怎么就攤上這事慷妙“竦” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵景殷,是天一觀的道長。 經(jīng)常有香客問我澡屡,道長猿挚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任驶鹉,我火速辦了婚禮绩蜻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘室埋。我一直安慰自己办绝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布姚淆。 她就那樣靜靜地躺著孕蝉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腌逢。 梳的紋絲不亂的頭發(fā)上降淮,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音搏讶,去河邊找鬼佳鳖。 笑死,一個胖子當(dāng)著我的面吹牛媒惕,可吹牛的內(nèi)容都是我干的系吩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼妒蔚,長吁一口氣:“原來是場噩夢啊……” “哼穿挨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起面睛,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤絮蒿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叁鉴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體土涝,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年幌墓,在試婚紗的時候發(fā)現(xiàn)自己被綠了但壮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀泻。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜡饵,靈堂內(nèi)的尸體忽然破棺而出弹渔,到底是詐尸還是另有隱情,我是刑警寧澤溯祸,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布肢专,位于F島的核電站,受9級特大地震影響焦辅,放射性物質(zhì)發(fā)生泄漏博杖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一筷登、第九天 我趴在偏房一處隱蔽的房頂上張望剃根。 院中可真熱鬧,春花似錦前方、人聲如沸狈醉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苗傅。三九已至,卻和暖如春班巩,著一層夾襖步出監(jiān)牢的瞬間金吗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工趣竣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摇庙,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓遥缕,卻偏偏與公主長得像卫袒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子单匣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容