【Web逆向】头号老玩家逆向分析
本帖最后由 hualy 于 2024-4-24 12:21 编辑网站:https://www.thlaowanjia.com/3554.html 打开开发者模式就转到about:blank
查一下资料:[阻止某些网站打开调试就跳转](https://blog.csdn.net/sonichty/article/details/106337097)
获得代码:
```JavaScript
window.addEventListener('beforeunload', function (e) { e.preventDefault();e.returnValue = '' });
```
优化后,刚开始觉得后面还会有用,发现到最后就不用了,嗯\~,学习一下也行:
```JavaScript
window.addEventListener('beforeunload', function (e) {
e.preventDefault();
});
```
像这种有触发条件的【F12】,一般,我们都可以在事件监听器找到答案,找呗,有学过相关知识的可以分析,这个不可能是哪一个,比如【click】点击事件,不过为了稳妥,我是一个一个找,怎么样判断是不是相关的事件,可以进行第三步移除,然后再触发此事件,比如再按F12
接着,会弹出如下图所示,说明不是第一个事件相关
那就继续重复呗,找呗,不过不要硬找,要有技巧的地找,如二分法,先砍掉一半,再触发,如果触发成功,那说明在这一半事件中,可以节省很多时间,然后还可以再学习学习相关的事件,不会就问GPT:
```JavaScript
DOMContentLoaded: 当网页的DOM结构完全加载并解析完成之后,不包括图片和其他媒体文件,会触发此事件。
click: 当用户点击鼠标按钮后释放时触发。
contextmenu: 当用户点击鼠标右键或者使用上下文菜单按键时触发,通常用于显示页面的右键菜单。
cut: 当用户执行剪切操作时触发,可以通过JavaScript访问剪切板数据。
hashchange: 当URL的哈希部分(即URL中"#"后面的部分)发生变化时触发。
keydown: 当用户按下键盘上的某个键并保持时触发。
keypress: 当用户按下键盘上的某个键并释放时触发,通常用于检测字符输入。
load: 当整个页面包括所有依赖资源如图片、样式表等完全加载后触发。
message: 当接收到来自其他窗口、帧或浏览器插件的消息时触发。
pjax:complete: 这是一个由某些JavaScript库定义的自定义事件,通常在PJAX(一种快速页面加载技术)请求完成后触发。
pjax:send: 这也是一个自定义事件,通常在PJAX请求发送之前触发。
popstate: 当用户操作浏览器的历史记录,如点击后退按钮导致页面后退时触发。
resize: 当浏览器窗口或框架的大小发生变化时触发。
scroll: 当用户滚动页面时触发。
```
接着,成功找到相对应的事件了,是【resize】:当浏览器窗口或框架的大小发生变化时触发。
点进去查看jquery-2.2.4.min.js?v=173060,好家伙,看不懂就不要管了!!!别学我,死要分析,后面才发现,跟这个js关系不大,浪费了我好多时间
【复盘】:jquery-2.2.4.min.js是一个框架来的,没必要死磕,不要觉得前端会改这个,没那么多时间,而且这是一个网络加载的js(事后发现),那就更不可能了
那就到shield.js了,一看,好家伙,限制全放这了
我认为这个js写得代码还是很不错的,对前端限制比较全面,可以学习学习,代码如下:
```JavaScript
//屏蔽右键菜单
document.oncontextmenu = function (event) {
if (window.event) {
event = window.event;
} try {
var the = event.srcElement;
if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")) {
return false;
}
return true;
} catch (e) {
return false;
}
}//屏蔽剪切
document.oncut = function (event) {
if (window.event) {
event = window.event;
} try {
var the = event.srcElement;
if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")) {
return false;
}
return true;
} catch (e) {
return false;
}
}//禁止f12
function fuckyou() {
window.close(); //关闭当前窗口(防抽)
window.location = "about:blank"; //将当前窗口跳转置空白页
}//禁止Ctrl+U
var arr = ;
document.oncontextmenu = new Function("event.returnValue=false;"), //禁用右键
window.onkeydown = function (e) {
var keyCode = e.keyCode || e.which || e.charCode;
var ctrlKey = e.ctrlKey || e.metaKey;
console.log(keyCode + "--" + keyCode);
if (ctrlKey && keyCode == 85) {
e.preventDefault();
}
if (arr.indexOf(keyCode) > -1) {
e.preventDefault();
}
}
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();
}
document.onkeydown = function (event) {
if ((event.keyCode == 112) || //屏蔽 F1
(event.keyCode == 113) || //屏蔽 F2
(event.keyCode == 114) || //屏蔽 F3
(event.keyCode == 115) || //屏蔽 F4
// (event.keyCode == 116) || //屏蔽 F5
(event.keyCode == 117) || //屏蔽 F6
(event.keyCode == 118) || //屏蔽 F7
(event.keyCode == 119) || //屏蔽 F8
(event.keyCode == 120) || //屏蔽 F9
(event.keyCode == 121) || //屏蔽 F10
(event.keyCode == 122) || //屏蔽 F11
(event.keyCode == 123)) { //屏蔽 F12
return false;
}
}
window.onhelp = function () {
return false;
};
function forbidKeyboard() {
$(document).keydown(function(e) {
/*9:Tab键, 17:Control键, 18:Alt键, 123:F12键, 83:S键*/
var keyboardCode = ;
for (i in keyboardCode) {
if (keyboardCode == e.keyCode) {
return false;
}
}
if ((e.keyCode == 83) && (e.ctrlKey || e.metaKey)) {
return false;
}
});
/*禁止文本选择功能*/
$(document).bind("selectstart",function(){return false;});
}
$(function(){
forbidKeyboard();
});
```
看到了这么多的函数,那就都重写一下吧,不知道为什么这样子重写的小伙伴可以参考一下我上一篇文章[【Web逆向】关于我是如何解决mooc禁止右键、复制](https://www.52pojie.cn/thread-1915231-1-1.html),里面有比较详细的介绍
```JavaScript
window.addEventListener('beforeunload', function (e) { e.preventDefault();e.returnValue = '' });
// 重定义事件处理函数为空函数
document.oncontextmenu = function() {};
document.oncut = function() {};
window.onkeydown = function() {};
window.onresize = function() {};
window.onhelp = function() {};
// 等待DOM完全加载
window.addEventListener('load', function() {
// 在尝试覆盖它们之前检查函数是否存在
var originalFuckYou = window.fuckyou || function() {};
var originalCk = window.ck || function() {};
var originalHehe = window.hehe || function() {};
var originalForbidKeyboard = window.forbidKeyboard || function() {};
// 覆盖函数
window.fuckyou = function() {
console.log("fuckyou 函数现在为空。");
// 可选地,如果需要可以调用原始函数
// originalFuckYou();
};
window.ck = function() {
console.log("ck 函数现在为空。");
// originalCk();
};
window.hehe = function() {
console.log("hehe 函数现在为空。");
// originalHehe();
};
window.forbidKeyboard = function() {
console.log("forbidKeyboard 函数现在为空。");
// originalForbidKeyboard();
};
// 尝试移除通过jQuery绑定的事件监听器,如果它们存在
try {
$(document).off("keydown");
$(document).off("selectstart");
} catch (e) {
console.log("未能移除 jQuery 事件绑定,或 jQuery 未加载。");
}
});
```
气氛都到这了,何不油猴一下呢,不知道怎么样使用油猴的小伙伴,可以参考一下[简单来说就是复制代码,然后放到新建的油猴脚本](https://www.52pojie.cn/forum.php?mod=redirect&goto=findpost&ptid=1904188&pid=49855295)
【我又来求好评啦\~】
```JavaScript
// ==UserScript==
// @name 头号老玩家解除限制
// @namespace http://tampermonkey.net/
// @version 2024-04-23
// @description头号老玩家解除限制,使得可以右键菜单、剪切、Ctrl+U、F1~F12、文本选择、Tab键、Control键、Alt键
// @author hualy
// @match https://www.thlaowanjia.com/3554.html
// @icon https://www.google.com/s2/favicons?sz=64&domain=thlaowanjia.com
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 测试使用
// window.addEventListener('beforeunload', function (e) { e.preventDefault();e.returnValue = '' });
// 重定义事件处理函数为空函数
document.oncontextmenu = function() {};
document.oncut = function() {};
window.onkeydown = function() {};
window.onresize = function() {};
window.onhelp = function() {};
// 等待DOM完全加载
window.addEventListener('load', function() {
// 在尝试覆盖它们之前检查函数是否存在
var originalFuckYou = window.fuckyou || function() {};
var originalCk = window.ck || function() {};
var originalHehe = window.hehe || function() {};
var originalForbidKeyboard = window.forbidKeyboard || function() {};
// 覆盖函数
window.fuckyou = function() {
console.log("fuckyou 函数现在为空。");
// 可选地,如果需要可以调用原始函数
// originalFuckYou();
};
window.ck = function() {
console.log("ck 函数现在为空。");
// originalCk();
};
window.hehe = function() {
console.log("hehe 函数现在为空。");
// originalHehe();
};
window.forbidKeyboard = function() {
console.log("forbidKeyboard 函数现在为空。");
// originalForbidKeyboard();
};
// 尝试移除通过jQuery绑定的事件监听器,如果它们存在
try {
$(document).off("keydown");
$(document).off("selectstart");
} catch (e) {
console.log("未能移除 jQuery 事件绑定,或 jQuery 未加载。");
}
});
// 如果这些函数是通过页面中的其他脚本定义的,并且定义在油猴脚本之前,
// 它们可能在油猴脚本运行之前就已经执行了,因此直接覆盖可能不会有效。
// 为了处理这种情况,我们可以使用一个Mutation Observer来监视新的script元素被添加。
// 这更复杂,但根据具体情况可能并非必要。
})();
``` 虽然禁用了F12和右键,但是还能打开菜单栏(右上角三个点)。抓包后分析限制都在 shield.js 文件中,将其置空再替换即可。 有点意思,特别是中间那段代码和命名 感谢分享 又学习了点, 一点点进步
js逆向我一直都学不好,大佬厉害 感谢分享
学到了 谢谢 感谢分享 谢谢楼主,期待更好的作品! 进来mark下,留着以后学。