再见,米哈游!原神社区防f12控制台调试代码全解(年轻人不讲武德)
前言
刚刚逛原神社区,不经意间按到了 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
查看一下:
很好,一个单纯相加的纯函数,现在我们只需要解决 if
、if_param1
,if_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
毫秒,将 r
与 k
挂载后发现,该 k
函数指向整个混淆函数(很长),其中包括了上面我们分析过的代码,具体我们不做分析了。
总结
经过一番分析,我们通透了无限 debbuger
的原理,这里再额外提及几点。
三维立体混元劲(前端混淆)
为了防止简单爬虫,一些站点会使用前端混淆,在原神社区使用的是类似 base64 的字典算法,本文没有详细研究。
其实在 webpack 打包下研究混淆价值并不大,如果有兴趣的同学可以学习网易云前端混淆算法,典例质量高,大家研究的都很通透(自行百度)。
另外前端混淆计算需要的时间很长,本例的混淆计算足足留有 4s
,实际上也要花费很昂贵秒级的时间,建议不要对核心 api 数据接口进行混淆,可以混淆主动发送时的 token 等几条少量关键词数据。
好好反思
目前对于 f12 防审查比较优秀的方案是 侦测控制台 + 跳转页面,是一种很友好的方案(同样有解)。
对于无限 debbuger
方案,因为是 eval
变体,有时还要附加 CSP 规则,所以不建议使用;另外,快速干掉无限 debbuger
只需要在控制台点一下忽略 debugger
按键即可:
或是给 debbuger
手工打上条件断点为 false
即可:
以上两种方法都可以一秒干掉该方案。
以和为贵
堂堂正正讲武德是不怕开控制台的,办法总比问题多,建议同学们不要耍小聪明,谢谢朋友们!
再见,米哈游!原神社区防f12控制台调试代码全解(年轻人不讲武德)相关推荐
- 原神社区-米游社网站开发--上导航栏
仿照原神社区-米游社做一个网页 之前做个优品购的项目,换汤不换药 打开页面,猜测上面导航因为是用fix固定做,下面部分,放在版心下做 结尾都是这个,那么就可以把头部尾部写在commend公共模块里面. ...
- 啥是原神?女友说想要全角色语音+表情包,顺手用python把高清图也整下来了
原神全角色中日语音+表情包+高清图 人生苦短 我用python 表情包部分: 1. 素材来自: 2. 准备模块 3. 调用浏览器驱动 4. 页面滚动 5. 保存数据 5. 效果 全角色语音+高清彩图部 ...
- JQ 全选后获取选中的值_【原神料理攻略】最全特殊料理展示与食谱获取
[原神观测枢]是集资料库.攻略.试玩.同人为一体的玩家内容创作平台. 大家好,这里是潇雨. 这篇文是<原神>的特殊料理展示.在做某些料理的时候,选择对应的角色有几率获得特殊料理.部分菜谱需 ...
- 原神抽卡模拟简单代码(概率还原)
代码如下: import java.util.Scanner; import java.util.Random;public class Main {public static void main(S ...
- 深度目标检测网络中关于anchor的神之问(配代码详解)(二)
目录 将所求出的所有anchor都用于计算吗?如何将筛选所用于计算proposal的anchor点? 如何用anchor来计算proposal(分类与边框回归)? 如何根据前景anchor和GT作Bo ...
- 做手游的计算机配置要求,原神pc配置要求高吗 最低什么配置能流畅运行
从最新消息来看,<原神>将于9月15日开启PC版技术开放性测试,是面向所有玩家的,不删档,本质上你就可以将其理解为正式上线了.原神是一款多平台.多数据互通的游戏.但显而易见的是PC版的原神 ...
- 原神服务器维护后抽奖池会更新吗,原神:更新维护一小时,补偿60原石,玩家祈求多维护几天!...
10月21号,原神社区发布公告,游戏将会在10月22号7点至11点进行停服维护,所有玩家在这个时间段将无法进入游戏.而作为补偿,官方会赠送5级以上的玩家240原石(停服一小时送60原石).这是偷偷的更 ...
- 原神如何修改服务器,原神服务器选择攻略 新手选择官服还是渠道服好
原神公测很快就要开启了,不光是有官服,还有很多的渠道服,那么到底要怎么选择最好呢?希望下面这篇原神新手选择官服还是渠道服好能帮到大家. 新手选择官服还是渠道服好 B服福利如何?我看B站预约马上就300 ...
- 制作一个简单HTML游戏网页(HTML+CSS)米哈游 1页 带轮播图
⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIV+CSS 布局制作,HTML+CSS网页设计期末课程大作业 | 游戏官网 | 游戏网站 | 电竞游戏 | 游戏介绍 | 等网站 ...
最新文章
- HUMAnN2:人类微生物组统一代谢网络分析2
- Maven项目SSM整合中mysql8.0.11对应Druid版本问题以及pom.xml写法
- boost::hana::filter用法的测试程序
- ASP.NET MVC 使用 FluentScheduler 定时器计划任务
- 实体类的动态生成(三)
- 注册docker hub账号
- mybatis源码分析(1)-----sqlSessionFactory创建
- 自学java后都是怎么找的工作?
- 计算机视觉隐私安全,震惊:用手机拍照也可以暴露大量个人隐私
- 计算机科学班会,计算机科学与技术学院20级13班召开“砥砺前行,“计”往开来”主题班会...
- viper4android fx原理,ViPer4android. FX顶级音效!
- office2019word2019excel2019ppt2019关闭自动更新设置步骤
- 《区块链助力粤港澳大湾区一体化发展报告(2022)》发布
- 本科毕业论文参考文献可以随便写吗?
- QCM2290平台XBL阶段I2C使能并点亮LED
- 自定义类 无极限树形结构菜单(繁杂版)
- USB-HOST、USB-DEVICE、USB-OTG
- 基于javaweb的网上图书商城系统(java+ssm+jsp+mysql+redis+jwt+shiro+rabbitmq+easyui)
- sanic flask fastapi 对比
- 2013年三月GBin1月刊