前言

刚刚逛原神社区,不经意间按到了 f12 打开了控制台,突然屏幕暗了,发生甚么事了!

我一看,嗷,原来是进到无限 debbuger 调试了,传统审查讲究点到为止,用了 debbuger 这还了得,马上开始审查源码。

左取源码

Fiddler 化劲

别看 Tab 标题是 VM 开头,其实右下角可以溯源,我们点进去格式化看看:

原来是这一行不讲武德,马上到 Fiddler 官网下载一个抓包工具,安装好后 ctrl + f5 刷新缓存找到该文件:

下载一份到本地,然后在 Fiddler 右侧面板配置本地拦截:

ok,现在我们在该文件头追加一行 console.log('拿下!') 刷新页面看一下:

(window.webpackJsonp=window.webpackJsonp||[]).push([[3],[,,,function(t,e,n){"use strict";console.log('拿下');n.d(e,"d",(function(){return r})),n.d // .........

控制台:

谢谢你,Fiddler 。

右判逻辑

不讲 rude

练功房(变量存放处)

先在文件开头声明好 rude ,方便存放我们后续的变量:

(window.webpackJsonp=window.webpackJsonp||[]).push([[3],[,,,function(t,e,n){"use strict";console.log('拿下');
window.rude = {};n.d(e,"d",(f   // .......

四两拨千斤(变量分析)

按之前控制台提示我们的那一行搜索 r("q287" 找到该处,之后把分号前相关的一部分逻辑做好全局赋值,方便我们查看。

赋值方法:

 // 不破坏原代码结构的局部赋值(window.key = .....)

同时注意不要把整个文件格式化,动哪一部分只需要简单手工格式化一下周边代码即可,因为经过 webpack 打包的代码完全格式化可能有上万行,而且会运行错误,所以一定要 手工格式化

逻辑结构如下,逻辑中,我们使用 ['...'] 代表挂载到 window.rude['...'] 上的值:

 (function (){// ......if(!['if'](['if_param1'], ['if_param2'])) {return !0}})[['plus1'] + ['plus2'] + 'r'](['value1'])(['value2'], ['value3'])[['arr']](['end'])

年轻人不讲 rude ,刷新页面,直接拿下!

整理得到:

 (function (){// ......if(!['if'](['if_param1'], ['if_param2'])) {return !0}})['const' + 'ructo' + 'r'](['value1'])('debu', 'gger')['call']('action')

至此为止,我们可以确认的是,通过修改函数的 constructor 实现了 debugger ,我们直接从控制台打印点开 value1 查看一下:

很好,一个单纯相加的纯函数,现在我们只需要解决 ifif_param1if_param2 的问题,他这个函数好像并没有执行,于是没有赋值到 rude 内。

训练有素(手动运行赋值)

先将该函数挂载到全局上:

0,215)],d[o("$WL(",0,0,0,-8)])){}else(// 找到函数开头window.rude['fun'] = function(){var t=function(t,e,n,o,r){return l(t,0,0,0,n- -9)},e=function(t,e

看起来 if 函数传入的两个参数也是混淆过的,那 if 函数内容是什么?

我们可以确定的是,虽然传入 if 函数的两个变量被混淆过,但 if 函数只是判断两个变量全等,这里两个变量不等,于是返回了 !0 ;另外,即使我们不知道该 function 上半部分的逻辑,也可以断定我们主动运行得到的结果仍然是一个存在的可行解。

从而逻辑整理得到:

 (function (){return true})['const' + 'ructo' + 'r']('debugger')['call']('action')

也就是:

 (function (){ return true })['constructor']('debugger')['call']('action')// 等价于(function (){ return true }).constructor.('debugger').call('action')

注:实际上,此处的 call('action') 中的 action 是没有作用的,只是大家 copy 过来 copy 过去的结果,此处毫无意义(可自行百度,你懂的)。

要讲武德

点到为止(不安全的 eval 行为)

我们可以看一下该段代码前面输出什么:

 < (function (){ return true })['constructor']('debugger')> ƒ anonymous() {debugger}

嗷!之前无限 debugger 显示在 VM 内的这段代码出处原来在此,那么调用该函数即可实现 debugger

注:实际上使用 ['constructor']('debugger') 是一种 eval 的变体,在一些严格情况下会导致报错:

这是一种高危行为。

小聪明(循环执行计时器)

最后还有一个问题,无限 debugger 的计时器在哪里?

搜索文件全文,一共有 7 个 setInterval ,根据实际中每次点击跳过 debugger 按键后要大概等待 4s 再次进入 debugger ,定位到相应位置:

setInterval((function(){var t,e,n,o,r={};r[(t=1407,e="ps6m",v(t-410,e))]=function(t){return t()},window.rude.r = r,r[(n=1407,o="ps6m",v(n-410,o))](window.rude.k = k);
}),4e3);

这里 4e3 即为 4000 毫秒,将 rk 挂载后发现,该 k 函数指向整个混淆函数(很长),其中包括了上面我们分析过的代码,具体我们不做分析了。

总结

经过一番分析,我们通透了无限 debbuger 的原理,这里再额外提及几点。

三维立体混元劲(前端混淆)

为了防止简单爬虫,一些站点会使用前端混淆,在原神社区使用的是类似 base64 的字典算法,本文没有详细研究。

其实在 webpack 打包下研究混淆价值并不大,如果有兴趣的同学可以学习网易云前端混淆算法,典例质量高,大家研究的都很通透(自行百度)。

另外前端混淆计算需要的时间很长,本例的混淆计算足足留有 4s ,实际上也要花费很昂贵秒级的时间,建议不要对核心 api 数据接口进行混淆,可以混淆主动发送时的 token 等几条少量关键词数据。

好好反思

目前对于 f12 防审查比较优秀的方案是 侦测控制台 + 跳转页面,是一种很友好的方案(同样有解)。

对于无限 debbuger 方案,因为是 eval 变体,有时还要附加 CSP 规则,所以不建议使用;另外,快速干掉无限 debbuger 只需要在控制台点一下忽略 debugger 按键即可:

或是给 debbuger 手工打上条件断点为 false 即可:

以上两种方法都可以一秒干掉该方案。

以和为贵

堂堂正正讲武德是不怕开控制台的,办法总比问题多,建议同学们不要耍小聪明,谢谢朋友们!

再见,米哈游!原神社区防f12控制台调试代码全解(年轻人不讲武德)相关推荐

  1. 原神社区-米游社网站开发--上导航栏

    仿照原神社区-米游社做一个网页 之前做个优品购的项目,换汤不换药 打开页面,猜测上面导航因为是用fix固定做,下面部分,放在版心下做 结尾都是这个,那么就可以把头部尾部写在commend公共模块里面. ...

  2. 啥是原神?女友说想要全角色语音+表情包,顺手用python把高清图也整下来了

    原神全角色中日语音+表情包+高清图 人生苦短 我用python 表情包部分: 1. 素材来自: 2. 准备模块 3. 调用浏览器驱动 4. 页面滚动 5. 保存数据 5. 效果 全角色语音+高清彩图部 ...

  3. JQ 全选后获取选中的值_【原神料理攻略】最全特殊料理展示与食谱获取

    [原神观测枢]是集资料库.攻略.试玩.同人为一体的玩家内容创作平台. 大家好,这里是潇雨. 这篇文是<原神>的特殊料理展示.在做某些料理的时候,选择对应的角色有几率获得特殊料理.部分菜谱需 ...

  4. 原神抽卡模拟简单代码(概率还原)

    代码如下: import java.util.Scanner; import java.util.Random;public class Main {public static void main(S ...

  5. 深度目标检测网络中关于anchor的神之问(配代码详解)(二)

    目录 将所求出的所有anchor都用于计算吗?如何将筛选所用于计算proposal的anchor点? 如何用anchor来计算proposal(分类与边框回归)? 如何根据前景anchor和GT作Bo ...

  6. 做手游的计算机配置要求,原神pc配置要求高吗 最低什么配置能流畅运行​

    从最新消息来看,<原神>将于9月15日开启PC版技术开放性测试,是面向所有玩家的,不删档,本质上你就可以将其理解为正式上线了.原神是一款多平台.多数据互通的游戏.但显而易见的是PC版的原神 ...

  7. 原神服务器维护后抽奖池会更新吗,原神:更新维护一小时,补偿60原石,玩家祈求多维护几天!...

    10月21号,原神社区发布公告,游戏将会在10月22号7点至11点进行停服维护,所有玩家在这个时间段将无法进入游戏.而作为补偿,官方会赠送5级以上的玩家240原石(停服一小时送60原石).这是偷偷的更 ...

  8. 原神如何修改服务器,原神服务器选择攻略 新手选择官服还是渠道服好

    原神公测很快就要开启了,不光是有官服,还有很多的渠道服,那么到底要怎么选择最好呢?希望下面这篇原神新手选择官服还是渠道服好能帮到大家. 新手选择官服还是渠道服好 B服福利如何?我看B站预约马上就300 ...

  9. 制作一个简单HTML游戏网页(HTML+CSS)米哈游 1页 带轮播图

    ⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIV+CSS 布局制作,HTML+CSS网页设计期末课程大作业 | 游戏官网 | 游戏网站 | 电竞游戏 | 游戏介绍 | 等网站 ...

最新文章

  1. HUMAnN2:人类微生物组统一代谢网络分析2
  2. Maven项目SSM整合中mysql8.0.11对应Druid版本问题以及pom.xml写法
  3. boost::hana::filter用法的测试程序
  4. ASP.NET MVC 使用 FluentScheduler 定时器计划任务
  5. 实体类的动态生成(三)
  6. 注册docker hub账号
  7. mybatis源码分析(1)-----sqlSessionFactory创建
  8. 自学java后都是怎么找的工作?
  9. 计算机视觉隐私安全,震惊:用手机拍照也可以暴露大量个人隐私
  10. 计算机科学班会,计算机科学与技术学院20级13班召开“砥砺前行,“计”往开来”主题班会...
  11. viper4android fx原理,ViPer4android. FX顶级音效!
  12. office2019word2019excel2019ppt2019关闭自动更新设置步骤
  13. 《区块链助力粤港澳大湾区一体化发展报告(2022)》发布
  14. 本科毕业论文参考文献可以随便写吗?
  15. QCM2290平台XBL阶段I2C使能并点亮LED
  16. 自定义类 无极限树形结构菜单(繁杂版)
  17. USB-HOST、USB-DEVICE、USB-OTG
  18. 基于javaweb的网上图书商城系统(java+ssm+jsp+mysql+redis+jwt+shiro+rabbitmq+easyui)
  19. sanic flask fastapi 对比
  20. 2013年三月GBin1月刊

热门文章

  1. linux恢复mysql数据库_linux下如何备份还原mysql数据库
  2. 数学建模拿到题目时思路
  3. Oracle Exadata X8M: 终结 DIY 数据库系统
  4. sql server查询分析器的一个选项...
  5. java 字体选择器_字体选择器
  6. 前端缓存/浏览器缓存机制
  7. 为什么数学是创造力的源泉:一位数学家的思考与信仰
  8. KMS激活windows
  9. 如此好文,值得一读再读。尤其是在迷茫的时候。
  10. 火狐浏览器关闭百度热榜(屏蔽网站特定元素)