hualy 发表于 2024-4-24 01:15

【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元素被添加。
    // 这更复杂,但根据具体情况可能并非必要。

})();
```

悦来客栈的老板 发表于 2024-4-24 08:35

虽然禁用了F12和右键,但是还能打开菜单栏(右上角三个点)。抓包后分析限制都在 shield.js 文件中,将其置空再替换即可。

披星代月 发表于 2024-4-24 08:08

有点意思,特别是中间那段代码和命名

秦腔小王子 发表于 2024-4-24 08:13

感谢分享

Vincent2018 发表于 2024-4-24 08:14

又学习了点, 一点点进步

xspapdc 发表于 2024-4-24 08:16

js逆向我一直都学不好,大佬厉害

millioxe 发表于 2024-4-24 18:13

感谢分享
学到了 谢谢

ZHOUJIAN75 发表于 2024-4-24 20:12

感谢分享

余律师 发表于 2024-4-24 21:16

谢谢楼主,期待更好的作品!

冯古屋 发表于 2024-4-24 21:30

进来mark下,留着以后学。
页: [1] 2 3
查看完整版本: 【Web逆向】头号老玩家逆向分析