项目地址:aHR0cHM6Ly9mbGlnaHQucXVuYXIuY29tL3NpdGUvb25ld2F5X2xpc3QuaHRtP3NlYXJjaERlcGFydHVyZUFpcnBvcnQ91tjH7CZzZWFyY2hBcnJpdmFsQWlycG9ydD3Jz7qjJnNlYXJjaERlcGFydHVyZVRpbWU9MjAyMC0wOC0xNiZzZWFyY2hBcnJpdmFsVGltZT0yMDIwLTA4LTE4Jm5leHRORGF5cz0wJnN0YXJ0U2VhcmNoPXRydWUmZnJvbUNvZGU9Q0tHJnRvQ29kZT1TSEEmZnJvbT1xdW5hcmluZGV4Jmxvd2VzdFByaWNlPW51bGw=
观前提示:
本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除
加密位置定位
直接全局搜索 pre 可以看到
那我们搜索 window._pt_ 却搜索不到东西
这时候就要猜想了:是被混淆拆分了呢?还是页面返回呢?
页面返回的话我们直接全局搜索pre的值
那确定不是返回的了就要找了
从 pre 的值随着页面的刷新变动猜测 应该和页面有关
那我们页面看看有没有特殊的代码
可以发现这里有一堆混淆代码 咋办?上神器操作!
不懂怎么玩神器的人可以跳到上一篇文章[2020-8-6]反混淆神器使用实战
Tips:神器会经常更新哦
还原JS后搜索一下 _pt_
出现了 那我们就可以确定是这个Js了
代码分析与推环境
代码不是很长 那就从头到尾看一遍吧
因为我们已经把混淆变量全都解密了所以这段代码可以去除哦
可以看到下面的try也可以去掉 不然你不会测试的时候不会报错哦
继续往下看你们会看到这里是一处内存溢出的错误 需要修改 方便调试
更改前
更改后
看着突然发现关键字location
在堆环境的时候要对关键字敏感哦
例如 window,document,navigator,location,screen 等等
看到这里有人问 不知道它返回的值要怎么补呢?
答:从哪里来回哪里去
例如这里的location['href'] 我们就回到刚刚扣这个js的页面的console里面输出一下
这样就出来了 我们自己补的话就例如
location={ "href":"https://flight.qunar.com/site/oneway_list.htm?searchDepartureAirport=%E9%87%8D%E5%BA%86&searchArrivalAirport=%E4%B8%8A%E6%B5%B7&searchDepartureTime=2020-08-16&searchArrivalTime=2020-08-18&nextNDays=0&startSearch=true&fromCode=CKG&toCode=SHA&from=qunarindex&lowestPrice=null&t=1597487313285&t=1597488333454" }
是不是很ez
接着往下翻看到一个document的createElement的操作
在浏览器一个创建操作会返回很多值可供浏览器操作 但是在我们node环境中
我们只需要看代码看他需要写入or写出什么值 返回出相对应的值就行了
例如上图这个操作需要写入src 我们只需要保证有src这个节点存在就即可
document={ createElement:function(a){ return { src:"" } } }
有创建就有获取
这里操作流程是
将将获取到的值置于_0x48bb47 所以我们要注意 _0x48bb47 这个关键字防止补漏
这里操作流程是取了元素名为script的值然后取数量接着遍历src的值
那跟上诉步骤一致去浏览器模拟一波
根据浏览器返回的值补上去就行啦!
注意:Js有多次获取的步骤所获取的参数不一样返回的也不一样注意区分
document={ getElementsByTagName:getElementsByTagName } function getElementsByTagName(a){ if(a=="script"){ return[ {src:"https://rmcsdf.qunar.com/api/device/answer.json?callback=callback_1597481838337&sessionId=9ed89d34-29d3-4586-bb08-a068d1940ac8&answer=yaov9fR7g7A3ZI6l6G5maXPWi0h2Yh75LLFoO-RDamQ3Zdq4LnEs63RGlXx4Ycb5Qq_dEfhJdiMnE1r5Gr_dIyxIcig3Y5b_GTlaIPQWuTsl91vnF6ovPKMT27tkNF6uV7lvs7sDUSg27F94FnpuOS8TrPNlBh-o7uovoXsXtLg5-90uIyYbSCMTvHQkBt-u6yobZWMG3-Nr9xPpQmovZy9T3nck71OoF2IvSeBCeGw4dcPp6mouY6cSs7w3Z4rz1XFdIPR-ayw2WAcqm7DlVGMTw7d1TUM1X3ia77gC009lhE8wCaovzzPCsig5YM6wCuob7rxI5iwvNhq5EvEfJHNShag26YapVOkg93xIwWx5AU73VaoxZaMS3Ldi0lfnHeIrYacH3-tlOca1F0ob6ScS2vtnB1P1GOpbOSsHiXgl9RfoGiob"}, {src:"https://rmcsdf.qunar.com/api/device/challenge.json?callback=callback_1597481837704&sessionId=9ed89d34-29d3-4586-bb08-a068d1940ac8&domain=qunar.com&orgId=ucenter.login"}, {src:"https://webresource.c-ctrip.com/resaresonline/risk/ubtrms/latest/default/chlorofp.js?siteId=c7e55b219200&v=120-7-15"}, {src:"https://ws.qunar.com/rt_recommend?count=3&fromCity=%E9%87%8D%E5%BA%86&toCity=%E4%B8%8A%E6%B5%B7&depDate=2020-08-16&includeTax=0&callback=jsonp_z1amvsmaj803dis"}, {src:"https://gw.flight.qunar.com/api/f/priceCalendar?dep=%E9%87%8D%E5%BA%86&arr=%E4%B8%8A%E6%B5%B7&days=&priceType=1&callback=jsonp_ag598vawefy9hdc"}, {src:"https://lp.flight.qunar.com/api/dom/recommend/nearby_route?from=%E9%87%8D%E5%BA%86&to=%E4%B8%8A%E6%B5%B7&start_date=2020-08-16&callback=jsonp_xff7wsmawvjwbai"}, {src:"https://flightopdata.qunar.com/vataplan?&id=41&callback=jsonp_g95ter3dbv9i0m2"}, {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=15974818366317732627&vatafrom=%E9%87%8D%E5%BA%86&vatato=%E4%B8%8A%E6%B5%B7"} ] } }
其他的一些相关的我就不全写出来啦 留给你们练手 讲一些原理就行啦
接着看能看到
看到这个 怎么模拟呢?
简单 反正看到 localStrage 都离不开 getsetremove 这三个
window.localStorage={ getItem: function (a) { return this[a] || null; }, setItem: function (a, b) { this[a] = b; }, removeItem: function (a) { delete this[a]; } }
缝缝补补就出正确的值了 堆环境也是很简单的 要多练 多分析 了解原理
推完环境运行效果
有人问 教练 我推完算出来不一样怎么办?
那一定是你堆少东西了
[完]