前言:海guan局的RS5代 环境检测点相对于药监J 要多了不少
本文主要是说下海guan局新闻页的RS5检测环境
网址 base64
: aHR0cDovL3d3dy5jdXN0b21zLmdvdi5jbi9jdXN0b21zL3h3ZmIzNC8zMDI0MjUvaW5kZXguaHRtbA==
本文说下重点的地方
一、window
下的一些函数检测
挂上window
代理 会发现检测了很多函数
贴上一些 剩余的对照下 浏览器下环境 补就行了 没有的就不要补了
其中有个比较重要的是window.matchMedia
函数 检测了一些参数返回的bool
值
window.matchMedia = function matchMedia(x){
if(x === '(any-pointer: fine )'){
return {
matches: true,
media: "(any-pointer: fine)",
onchange: null,
}
}else if(x === '(any-pointer: coarse )'){
return {
matches: false,
media: "(any-pointer: coarse)",
onchange: null
}
}else if(x === '(any-pointer: none )'){
return {
matches: false,
media: '(any-pointer: none)',
onchange: null
}
}else if (x==='(any-pointer )'){
return {
matches: true,
media: "(any-pointer)",
onchange: null
}
}else if (x==='(any-hover: hover )'){
return {
matches: true,
media: '(any-hover: hover )',
onchange: null
}
}else if(x === '(any-hover: on-demand )'){
return {
matches: false,
media: '(any-hover: on-demand )',
onchange: null
}
}else if(x==='(any-hover: none )'){
return {
matches: false,
media: '(any-hover: none )',
onchange: null
}
}else if(x === '(any-hover )'){
return {
matches: true,
media: '(any-hover )',
onchange: null
}
}else if (x==='(color-gamut: srgb )'){
return {
matches: true,
media: '(color-gamut: srgb )',
onchange: null
}
}else if(x === '(color-gamut: p3 )'){
return {
matches: false,
media: '(color-gamut: p3 )',
onchange: null
}
}else if(x === '(color-gamut: rec2020 )'){
return {
matches: false,
media: '(color-gamut: rec2020 )',
onchange: null
}
}else if(x=== '(color-gamut )'){
return {
matches: true,
media: '(color-gamut )',
onchange: null
}
}
};
还有个就是window.WebSocket
函数
window['WebSocket'] = function WebSocket(){
throw DOMException('Failed to construct \'WebSocket\': The URL \'itsgonnafail\' is invalid.')
};
二、document.createElement
方法 里面的 audio
video
标签里面的canPlayType
方法检测
else if(tagName == 'audio'){
var audio = {};
audio['canPlayType'] = function (x){
if (x === "audio/x-m4a;audio/aac;"){
return 'maybe'
}
else {
return 'probably'
}
};
audio['canPlayType'].toString = ()=>'function canPlayType() { [native code] }';
return audio
}
三、原型属性检测
navigator
下的原型属性webdriver
检测
代码运行过程中 会使用 以下两次方法
Object.getOwnPropertyDescriptor(navigator,"webdriver")
Object.getOwnPropertyDescriptor(navigator.__proto__,"webdriver")
这里是获取navigator的原型下的描述属性
所以我们要把webdriver
定义再其原型上
正常情况下我们补的时候 描述属性是这样的
在浏览器 环境下 是没有value
属性的这个要注意!
后续也会判断 描述属性下是否有value
接着又是判断get
方法 是不是一个函数 并且检测了它的toString
方法 是否包含native code
toString
检测
在浏览器环境下 是这样的
'function get webdriver() { [native code] }'
四、点击事件对象的target
属性里面的getBoundingClientRect
函数
这个函数会返回你当前点击节点的对应坐标位置
getBoundingClientRect = ()=>{return {
"x": 454.078125,
"y": 736.21875,
"width": 570,
"height": 26,
"top": 736.21875,
"right": 1024.078125,
"bottom": 762.21875,
"left": 454.078125
}
这样就行了
其他比较重要的就是load
事件之后的 canvas
webgl
里面的东西了 自己补补吧
大概比较重要的就这么多