其实关于网上瑞数的教程已经很多了,数不胜数。那为啥我还要写呢?主要有以下几个方面:
大家的教程都是一种骨架,何为骨架?就是给你一个大的方向,其中的坑需要自己一个一个去踩,遇到不会的然后还要去网上找相应的解决办法,问别人问多了别人也没时间,懒得搭理你,大家都很忙。
所以出于以上以及自己做一个技术笔记的理念出发,有了此文!具体的骨架大家都会,csdn一大把问章教学,这里分享下具体的补环境过程和最后框架来补,环境不会补全,自己要举一反三!
首先咱们打开一个无痕模式的浏览器,并钩上脚本断点,如图:
具体的网址也在图中,然后刷新网址,你会看到一个js文件,然后你惦记图里的小框里的那个按钮,会进去index.html文件,也就是图里的html
我们把这段js代码全选,然后复制到咱们编译器,我这里是pycharm
回到上面的html文件中,把图中的两个框里的也放在编译器里去:
一个是自执行的函数,一个很长的变量,一起放进去后如下:
因为我们需要导出cookie,写一个导出的函数即可!接下来开始补环境!
我们直接运行的这个js文件,会出现window未定义,补上。
window = global
在我们正式补环境之前,需要固定住一份静态的代码,方便后面好调试,操作如下我们把index文件右键,点击本地替换保存。然后搜索.call
打上断点,如果打不上,你需要刷新一下就能打上断点了。此时我们把代理脚本放进去:
// 代理器封装
function getEnv(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,' 属性值类型:',typeof target[property]);
return target[property];
},
set: function(target, property, value, receiver){\n
console.log('方法:set',' 对象:${proxy_array[i]}',' 属性:',property,' 属性类型:',typeof property,' 属性值类型:',typeof target[property]);
return Reflect.set(...arguments);
}
}`;
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','target' ]
getEnv(proxy_array)
运行会报window.top未定义,它的值其实就是window;补上window.top=window即可。注意代码的格式:
然后运行看看报啥错:说是缺少了这个标签
看看什么意思:所以是要创建一个html的元素,什么元素?
我们输出元素即可:在此之前我们还是要从前面的call方法进去,这是4代的入口,我们断点段在了call方法的时候,点击进入当前函数调用那个按钮
进去了后,你会发现进入了一个vm文件中去了,每个人的都不一样!
我们回到上面的报错,输入以下代码看看返回的是真么东东,
document = {
createElement : function (res){
console.log('这个东东获取的值是莫西:',res)
if(res == 'div'){
return div
}
}
返回的是div标签,标签在html是一个对象。所以我们补div对象就行。
说这个不是函数,此时我们去到刚刚进去的vm文件,直接搜索:
很明显我们刚刚创建的div标签的值是对的,仔细看看这两行代码:
_$n0 = _$v8[_$By[9]]('div')
, _$so = _$n0[_$By[51]]('i');
这里的意思是_$no是div,而_$so等于div然后getElementsByTagName创建一个i标签,补上代码前看看返回什么,类型是对象,所以返回对象就行
div = {
getElementsByTagName: function (val) {
if (val === 'i') {
return {
length: 0
}
}
}
}
继续看吐出来的是啥错误:
其实对浏览器开发不是很熟悉的,这里我们最好去浏览器环境看一下,哪些udndefind是它本身,哪些是需要补的
所以很明显了,我们要补的就是事件监听器,然后看报错:
去搜这个看看在哪
发现没返回什么值,直接给它一个空函数即可!
window.addEventListener = function(){
// console.log(arguments)
}
然后就这样一直一直补!直到出了值。说实话这补起来的真的累人,我们直接扔进补环境框架秒杀它。
好,4代的思路大概就是如此,5和6也差不太多!最后懒得补了,直接copy了一份好友的js代码,然后放星球了!框架生成的代码暂不放!星球:凡人修仙传