声明

本文仅供学习参考,请勿将其用于任何违法操作。本文中所涉及的技术和方法仅用于解析和理解游戏开发中可能存在的漏洞和调试技巧,并非用于破坏游戏平衡、修改游戏数据或进行其他违法行为。本人强烈呼吁读者遵守法律法规,尊重游戏开发者的劳动成果和游戏规则,并在合法范围内进行学习和研究。如因不当使用本文所述方法导致任何违法行为或造成任何不良后果,责任将完全由使用者自行承担。

环境

本文使用Edge浏览器进行示范

Edge

原理

由于4399屏蔽了F12、Ctrl+Shift+I和右键菜单,我们直接通过浏览器菜单中的开发人员工具(以下称为开发者工具)选项打开开发者工具。

这时候浏览器被强制暂停了,同时开发者工具中定位到了虚拟机中运行的匿名函数,里面有一个debugger。

我们使用快捷键Ctrl+Shift+F全局搜索debugger。

搜索debugger

定位到前两处搜索结果。

前两处搜索结果

其中function() {}['constructor']('debugger')等价于new Function('debugger'),意思是将debugger这句代码当成函数体,js中写入debugger并在打开开发者工具的前提下会使网页进入断点调试模式,搭配上setInterval()定时器,可以做到无限触发调试模式的效果。

然后定位到第三处搜索结果。

第三次搜索结果

依然是在定时器中使用了debugger,不同的是这里没有运行在虚拟机中。这里使用了after.getTime() - before.getTime() > 2000判断执行时间是不是超过了两秒,因为打开控制台的时候会阻塞代码(js是单线程的),会导致两次定时器运行的时间间隔变长,从而判断控制台被打开了。另外Anti_numtots>=2判断了是否有两次的执行时间超过了100毫秒,如果超过了,也算作打开了开发者工具。如果发现打开了开发者工具,则提示弹窗,并且刷新网页。

自此我们大致了解了4399屏蔽开发者工具的原理(为什么是大致?看到后面就懂了)。

然后我们可以开始阻止4399的无限debugger了

以下将使用替换法:

首先在左侧文件列表中找到Antiindulgence.js文件。

Antiindulgence.js

右键选择替代内容

替代内容

这时候开发者工具提示我们要把Antiindulgence.js文件存储在哪里,我们可以随便选择一个空文件夹。

提示

选择完成后浏览器会提示我们是否要给予这个目录的访问权限,我们选择允许。

权限

这时候Antiindulgence.js文件就被保存到了本地,当浏览器中运行Antiindulgence.js文件的时候会使用这个本地的文件代换服务器上的文件。

使用文本方式打开Antiindulgence.js文件。然后删除以下代码即可。

删除这些代码

//疯狂调试模式

setInterval(function(){

check();

}, 2000);

var check = function(){

function doCheck(a){

if (('' + a / a)['length'] !== 1 || a % 20 === 0){

(function() {}['constructor']('debugger')());

} else {

(function() {}['constructor']('debugger')());

}

doCheck(++a);

}

try {

doCheck(0);

}catch(err){}

};

check();

function consoleOpenCallback() {

alert('关闭调试窗');

window.location.reload();

}

var Anti_numtots = 0;

(function () {

window._windon_handler = setInterval( function() {

var before = new Date();

debugger;

var after = new Date();

if (after.getTime() - before.getTime() > 100) {

if (after.getTime() - before.getTime() > 2000) {

consoleOpenCallback();

clearInterval(_windon_handler);

}else{

Anti_numtots++;

if(Anti_numtots>=2){

consoleOpenCallback();

clearInterval(_windon_handler);

}

}

}else{

Anti_numtots = 0;

}

}, 1000)

})();

然后刷新网页,可以正常运行了。

emmm运行了一会儿发现又被暂停了。

这是从哪里冒出来的?我们查看调用栈,找到了一处令人怀疑的地方。

这个函数内创建了一个script标签,atob是js内置的解析Base64编码字符串的函数,我们在控制台中执行atob("KGZ1bmN0aW9uIGEoKXt0cnl7KGZ1bmN0aW9uIGIoKXtkZWJ1Z2dlcjtiKCl9KSgpfWNhdGNoKGUpe3NldFRpbWVvdXQoYSw1ZTMpfX0pKCk")。

好家伙,果然是罪魁祸首。

我们也可以使用上面提到的替换法,将BuildWeb.framework.js文件替换成本地的。

我们直接在本地删除函数_JS_PokiSDK_preInit的函数体。

我这里直接注释掉了

刷新网页。至此所有问题都解决啦!!

其他

在上面提到的Antiindulgence.js文件中,我们可以找到屏蔽F12、Ctrl+Shift+I和右键菜单的代码,用替换法删除这些代码即可恢复这些功能

屏蔽F12、Ctrl+Shift+I和右键菜单的代码