声明:本文仅作学习交流,请遵守法律法规,不要恶意爬取网站。
瑞数5
瑞数5的防护措施和瑞数4基本相似
瑞数5第一次请求会返回412以及一个cookie-A,
响应的html中有一段自执行函数,配合js会生成一个cookie-B;
第二次请求时要带上cookie-A和cookie-B才能得到正确的结果。
我们逆向要解决的就是如何拿到cookie-B
补环境
补环境的方式有很多,高端点的有用插件自动补环境(v-jstools)、有用jsdom补环境,但是高端的方式有时未必好用。
本次是用低端的纯手动补环境的方式,先用代理吐环境,然后挨个补环境。
吐环境的code附上:
function get_enviroment(proxy_array) {
for(var i=0; i<proxy_array.length; i++){
handler = '{\n' +
' get: function(target, property, receiver) {\n' +
' console.log("方法:", "get ", "对象:", ' +
'"' + proxy_array[i] + '" ,' +
'" 属性:", property, ' +
'" 属性类型:", ' + 'typeof property, ' +
// '" 属性值:", ' + 'target[property], ' +
'" 属性值类型:", typeof target[property]);\n' +
' return target[property];\n' +
' },\n' +
' set: function(target, property, value, receiver) {\n' +
' console.log("方法:", "set ", "对象:", ' +
'"' + proxy_array[i] + '" ,' +
'" 属性:", property, ' +
'" 属性类型:", ' + 'typeof property, ' +
// '" 属性值:", ' + 'target[property], ' +
'" 属性值类型:", typeof target[property]);\n' +
' return Reflect.set(...arguments);\n' +
' }\n' +
'}'
eval('try{\n' + proxy_array[i] + ';\n'
+ proxy_array[i] + '=new Proxy(' + proxy_array[i] + ', ' + handler + ')}catch (e) {\n' + proxy_array[i] + '={};\n'
+ proxy_array[i] + '=new Proxy(' + proxy_array[i] + ', ' + handler + ')}')
}
}
proxy_array = ['window', 'document', 'location', 'navigator', 'history','screen']
// 这里写你要补的环境
get_enviroment(proxy_array)
逆向过程
先扣代码
这里的扣代码不是从cookie生成的位置开始扣,而是把整个代码都拿下来,就是上文提到的一个js里的代码以及返回的html中的自执行函数。因为cookie生成后会添加到document.cookie中,我们补完环境直接拿就好了。
你可以按如下方式拿到所需的代码:
方式①:监听脚本
清除cookie后刷新页面, 源代码页面会逐个显示脚本文件
方式②: hook cookie
(function () {
// 严谨模式 检查所有错误
'use strict';
// document 为要hook的对象 这里是hook的cookie
var cookieTemp = "";
Object.defineProperty(document, 'cookie', {
// hook set方法也就是赋值的方法
set: function (val) {
// 这样就可以快速给下面这个代码行下断点
// 从而快速定位设置cookie的代码
if (val.indexOf('ihkYnttrQXfVP') != -1) {
console.log('Hook捕获到cookie设置->', val);
debugger;
}
// console.log('Hook捕获到cookie设置->', val);
cookieTemp = val;
return val;
}, // hook get 方法也就是取值的方法
get: function () {
return cookieTemp;
}
});
})();
用油猴写脚本hook到cookie,跟栈就能找到需要的html,外链js直接在源代码中能找到
重点:一定要替换这个html页面,因为这个自执行函数可能会变,不替换的话,后面不好调试!
替换好文件后把代码扣出来
再补环境
加上吐环境的代理开始补环境
①运行后遇到了第一个报错,这是一个没有表明是哪段code有问题的报错,这种时候我们先按日志的提示补一下
这个时候我们先看看浏览器中的window.top是什么,先给这个补一下看看
补完后发现通过了,来到了第二个报错
②遇到了能显示代码的报错,这个时候在vmp中搜索代码,打断点看看这部分代码是做什么的
在html的页面,点进入下一个函数调用,进到vmp里搜索,在可疑处都打上断点,然后跳到断点处
在断点处可以看到这里的:
_$Bb ----> document
_$Nd[20] ----> createElement
_$Nd[64] ----> div
document对象里有个createElement,创建了一个div标签,标签可以看做是个对象
这时候我们可以补成:
document = {}
document.creatElement = function(){
return {}
}
再往下看一行:
_$q0 ----> div
_$Nd[639] ----> getElementsByTagName
_$Nd[636] ----> i
div标签中存在一个getElementsByTagName方法,去获取i属性(往下走一行可以看到结果是空对象)
这两行代码连起来,顺便加上日志,我们可以补成这样:
div = {
getElementsByTagName: function (arg) {
console.log('div.getElementsByTagName:', arg)
if (arg === 'i'){
return []
}
}
}
document = {}
document.createElement = function(arg){
console.log('document.createElement:', arg)
if (arg === 'div'){
return div
}
}
照着这个思路补下去,能找到代码位置的报错就到源代码里搜索检查应该补成什么,找不到位置的报错按日志补成相应的值或函数。尽量和浏览器上的结果一致。
最终补到没有报错之后,我们会得到cookie值
很明显,我们补环境得到的cookie更短些,因为毕竟是补环境,很难做到和真实的浏览器环境一致。但是cookie短并不代表不能用。这个时候就需要带着cookie去发送下请求。
如果能得到200的结果,那你是幸运的;
当然很大几率会是412,此时我们需要继续补环境
我们要检查下日志中输的undefined的地方,在浏览器中的输出是什么样的,如果浏览器不是undefined那就需要补成对应的结果(如果是个函数,而你又不知道该补的函数是什么样,不妨先补个空函数);
还要检查下补得环境输出的值是否正确,尤其是补的函数,因为补的函数存在后,代码运行就不会报错,很难发现其返回值是否正确,需要对照浏览器上的代码好好检查
这会是一个很枯燥,很费时的过程,但最终经历千辛万苦获得的成功,也会给你带来极好的体验。