1.现象

网页一看就是脚本小子的风格,果不其然,一按F12就会跳转到空白页,通过浏览器功能栏打开控制台就会崩溃刷新页面。

2.实现的恶意代码

居然还有脚本小子的注释:

网页中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<script>
function fuckyou(){
window.close(); //关闭当前窗口(防抽)
window.location="about:blank"; //将当前窗口跳转至空白页
}
// 沫欢:这个函数名起的就和网站名cnm.sb一样,素质在哪
// 沫欢:其他函数负责禁用各种键和检测是否开控制台,检测到开控制台调用fuckyou()函数。
function click(e) {
if (document.all) {
if (event.button==2||event.button==3) {
alert("禁止拿代码"); // 沫欢:呵呵
oncontextmenu='return false';
}
}
if (document.layers) {
if (e.which == 3) {
oncontextmenu='return false';
}
}
}
if (document.layers) {
fuckyou();
document.captureEvents(Event.MOUSEDOWN);
}
document.onmousedown=click;
document.oncontextmenu = new Function("return false;")
document.onkeydown =document.onkeyup = document.onkeypress=function(){
if(window.event.keyCode == 123) { // 沫欢:123是F12的键值
fuckyou();
window.event.returnValue=false;
return(false);
}
}
</script>
// 沫欢:下面这段代码经过混淆加密,已经将几个函数名变量名简化,但混淆器还是提取了字符串进行了结构混淆,增加了很多无意义代码,但因为我不会JavaScript,保留。
<script>
var strs = ["length", "", "debugger", "constructor"];
!(function test() {
try {
!(function cryptofunc(cryptoin) {
((strs[1] + cryptoin / cryptoin)[strs[0]] !== 1 || cryptoin === 0) && function() {}
[strs[3]](strs[2])(),
cryptofunc(++cryptoin)
}(0))
} catch(e) {
setTimeout(test, 80)
}
}())
</script>

<script>
//禁止鼠标右键
document.oncontextmenu = function(){
return false;
}
document.onkeydown = function(){
var e = window.event || arguments[0];
if(e.keyCode == 123){ //屏蔽F12
return false;
}else if(e.ctrlKey && e.shiftKey && e.keyCode == 73){ //屏蔽Ctrl+Shift+I,等同于F12
return false;
}else if(e.shiftKey && e.keyCode == 121){ //屏蔽Shift+F10,等同于鼠标右键
return false;
}
}
</script>
// 沫欢:其实你不说我还真不知道 Ctrl+Shift+I 等同于F12和 Shift+F10 等同于鼠标右键,学到了。

<script type="text/javascript">
//判断F12审查元素
function fuckyou() {
window.close(); //关闭当前窗口(防抽)
window.location = "about:blank"; //将当前窗口跳转置空白页
}
// 沫欢:怎么又定义一遍,你跟网站访客有多大仇,要草两遍?(其实是代码分成了两段)
function ck() {
console.profile();
console.profileEnd();
//判断profiles里有无内容,若有,则说明按下了F12
if(console.clear) {
console.clear()
};
if(typeof console.profiles == "object") {
return console.profiles.length > 0;
}
}

function hehe() {
if((window.console && (console.firebug || console.table && /firebug/i.test(console.table()))) || (typeof opera == 'object' && typeof opera.postError == 'function' && console.profile.length > 0)) {
fuckyou();
}
if(typeof console.profiles == "object" && console.profiles.length > 0) {
fuckyou();
}
}
hehe();
window.onresize = function() {
if((window.outerHeight - window.innerHeight) > 200)
//判断当前窗口内页高度和窗口高度,如果差值大于200,那么则说明浏览器调试框已被打开
fuckyou();
}
</script>

独立js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// 反调试函数,参数:开关,执行代码
function endebug(off, code) {
if (!off) {
!function (e) {
function n(e) {
function n() {
return u
}
function o() {
window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized ? t("on") : (a = "off", console.log(d), console.clear(), t(a))
}
function t(e) {
u !== e && (u = e, "function" == typeof c.onchange && c.onchange(e))
}
function r() {
l || (l = !0, window.removeEventListener("resize", o), clearInterval(f))
}
"function" == typeof e && (e = {
onchange: e
});
var i = (e = e || {}).delay || 500,
c = {};
c.onchange = e.onchange;
var a, d = new Image;
d.__defineGetter__("id", function () {
a = "on"
});
var u = "unknown";
c.getStatus = n;
var f = setInterval(o, i);
window.addEventListener("resize", o);
var l;
return c.free = r, c
}
var o = o || {};
o.create = n, "function" == typeof define ? (define.amd || define.cmd) && define(function () {
return o
}) : "undefined" != typeof module && module.exports ? module.exports = o : window.jdetects = o
}(), jdetects.create(function (e) {
var a = 0;
var n = setInterval(function () {
if ("on" == e) {
setTimeout(function () {
if (a == 0) {
a = 1;
setTimeout(code);
}
}, 200)
}
}, 100)
})
}
}

endebug(false, function () {
// 非法调试执行的代码(不要使用控制台输出的提醒)

document.write('<div style="text-align:center;color:red"><h1>北枫好心提醒您:检测到非法调试,请关闭后刷新重试!!!</h1></div>');
});

总结

这应该是我见过防控制台最厉害的脚本了,使用极端的方法才能打开控制台。

不过这有什么意义呢,最多防防小白,因为即使你做得更好使控制台真的打不开了,我们还可以抓包呀哈哈哈,你js永远防不了抓包。

所以有些恶意软件的作者也深谙此道,不给你在浏览器里看他的资源(比如某些网课平台),必须下载手机或电脑APP才能打开,做的更绝的也有:

第一级是不用HTTP协议传输资源,直接用TCP或UDP

第二级是用DNS等协议传输 ,这种奇葩也见过

第三级自己搞个文件类型,甚至自己搞个协议传输。文件类型不是为了高效利用存储空间,而是为了不让别的软件能打开即使多占空间也没事,自己的协议也不是为了提高传输效率,是防止别的软件能读取降低效率也在所不惜。

不断提高用户获取资源的难度和成本才是这些恶意软件的目的。