JS逆向:记一次QN网抠代码补浏览器环境

目标QN网pre参数。
第一步,先抓包:

可以看到pre参数。全局搜索url:api/domestic/wbdflightlist。跟踪到这里:
可以看到pre的赋值,来自于window.pt。控制台打印一下:
与上面的pre参数相吻合。查找pt的赋值:
并没有找到,看来是被混淆了。写个脚本hook一下,如果捕捉到window.pt赋值,则会触发debugger断在这里,同时我们也可以观察到赋值的调用栈。
这里我尝试了控制台输入hook与油猴脚本hook,都没有hook到。最后用Fiddler注入成功hook到了位置。猜测是执行的顺序问题。
可以看到这段JS来自于html内
在网页源代码中也是找到了这样一段代码:
混淆过的,用AST简单还原一下。
具体操作在我之前的文章中有提到,代码都差不多,这次并没有在反混淆上细抠。代码也不多了,分析一下呗。首先window.pt是有的:
里面有很多try catch
我们需要先去掉,否则报错都不知道哪里。去掉之后运行:
对着错误一层一层向上去找,最后定位到这:
我怎么感觉这里的套路这么眼熟呢,好像在之前处理V5的时候遇到过。让我翻一翻。。

果然之前遇到过这个套路,那就是检测换行呗,又想让我爆内存是吧。不会上当了。我们先把这个地方的代码挖出来分析分析:

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这两个方法转成字符串后用正则匹配,如果有匹配不到的参数,那就调用_0x34c898("indеxOf")无限循环。他是在检测代码是否被格式化,在网页中加载的代码是被压成一行的,如果匹配到了换行\n,那就代表着代码被人挖出来格式化了。我们直接把调用的地方注了。

然后就是开始补环境了,对着报错的地方去原网页里找。

诸如此类,他要什么,我们给什么就是。上个最后补完的结果:
        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)作为全球最大的中文旅游搜索引擎,通过对机票,酒店,旅游线路的整合与发布,提供专业、实时、可信的旅游产品价格比较与服务比较系统,帮助消费者轻松进行充分选择,是您预订机票、酒店、旅游线路的最佳选择!"
                        }
                    }
                }
            }

        }

这里有些方法比如getElementsByTagName、localStorage.setItem等是Node里没有的,这些可以用一些巧妙的方法处理,说到底他不就是要验证浏览器环境吗,离不开一句话,他要什么,我们给什么。

node环境运行结果:

浏览器运行结果:

一样,通关!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容