郑重声明:本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关。
加载流程
url:aHR0cDovL2xpYi5jcXZpcC5jb20vUWlrYW4vU2VhcmNoL0luZGV4P2Zyb209aW5kZXg=
简单说一下瑞数5代的加载流程,首先打开一个无痕浏览器,输入维普的url ,查看其加载过程
可以看到,当在一个干净的浏览器环境中第一次请求时,会首先返回一个412页面,这个412页面又加载了一个js文件,然后才返回了首页的200页面,我们可以先观察两个Index?from=index
有什么不同
第一个Index?from=index
第二个Index?from=index
很明显,他们的不同之处在于cookie,其中GW1gelwM5YZuS是服务器返回的,而GW1gelwM5YZuT则是js代码生成的,也就是说我们必须破解GW1gelwM5YZuT的生成过程
定位cookie
定位cookie最快的方式自然是hook了,首先新开一个无痕窗口,然后打一个事件断点,输入url回车
断点断住后,在控制台注入以下代码
(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设置-->', 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');})();
断点断住后,跟栈调试
通过跟栈找到cookie生成位置,这是个vm文件,一般这种文件都是eval生成的
继续跟栈到412页面,找到eval函数,其中_$FP就是vm中的代码
跟到这里,我们已经知道cookie生成的大致流程了,当不携带cookie访问首页时,服务器返回一个412页面,412页面会执行了一些js代码,生成了_$FP(字符串类型的js代码),然后调用eval函数将_$FP给执行了,生成了vm文件,vm文件执行后生成了cookie。
扣代码
红色标注的位置全部都要扣下来
补环境
在瑞数的代码还未执行eval之前,可以使用proxy代理补,在执行eval后就不能使用proxy了,为什么不能使用了,懂的都懂,既然不能使用proxy了,那我怎么知道他检测了那些环境呢,其实很简单,就像华为牛过河的面试题的答案一样,他是直接过,我是直接调,两个字:硬刚
第一步复制刚才那份412页面的所有代码,保存到本地为rs.html(记住代码不要格式化)
第二步在rs.html的头部加入以下代码,这么做是为什么,大家应该懂我意思吧
<script>eval_= eval;eval = function(s){debugger;return eval_(e)}eval.toString = function(){return 'function eval() { [native code] }'}// 保持环境的一致性Object.defineProperty(window,'indexedDB',{ger(){return underline;}}) ......</script>
第三步,使用fiddler本地替换,当断点断住之后,直接调试就可以了,看他检测了什么就补什么(有一些是可以不补的,这就要看你对浏览器的了解了)
至于怎么调试最快最有效就是基础知识了,如果你调试技巧足够娴熟,一天就能补出所有环境,当然后续还有很多坑
可以参考挽风大佬的文章
如果你自己生成的cookie有173位了,那你因该可以拿到首页的200,如果生成的cookie有279位(记得模拟load事件执行),则可以拿到搜索接口的200,记住cookie的时效性非常短,如果你想在node中生成,然后复制到python脚本中去请求是行不通的。
搜索接口后缀生成
在搜索接口有一个后缀,他其实是重写了XMLHttpRequest.prototype.open
方法,只要你调用这个方法,就会自动为url加上后缀
如果你生成的cookie没问题的话,你可以直接用proxy代理出后缀生成的检测点
成果展示
如果觉得《维普期刊 瑞数5》对你有帮助,请点赞、收藏,并留下你的观点哦!