文章转载自公众号劉凯里
一个阳光明媚的周末,透光的窗帘把我从睡梦中叫醒,大脑说今天是周六,可以慵懒个一上午,于是开心地打开我的 Mac 准备看两集 Rick and Morty 再起床洗漱。
我迫不及待打开了对应的网站,发现浏览器提示 No internet,这才发现因为我的动作太过于行云流水,电脑还没来得及连上 wifi
科普:Chrome 浏览器是 Google 家的官方浏览器,使用体验全世界南波万。当用户在无网络时访问某一网址,浏览器会提示“无网络链接”(也就是上面这张图),按下空格键,就会唤醒一个小恐龙跑步刷分的游戏。 如果在有网络连接时也想玩的话,可以直接在地址栏输入:chrome://dino
出于职业本身的敏感和好奇,我突然心生疑问:这应该是用 JS 做的吧? 我顺势打开控制台,不如先看一下所有的全局变量?
239 个...太多了,我可没这个耐心 我停止了操作,开始思考这一切的可行性:
- 我在干什么?尝试自定义这个游戏
- 为什么要看全局变量?因为假设关于游戏的对象被暴露在了全局
- 如果没暴露在全局?行,那我就放弃了(周末的早晨我可不想在 sources 里面扒源码) 也就是说,如果没有在全局变量里找到那个对象,我就可以选择性放弃了。
再看一下上面这张图,不难发现,这 239 个全局变量,有很多都是老朋友了,name、history、location、onclick、onerror... 这些变量明显和这只小恐龙没啥关系,打印出来纯粹是来充个数,还浪费了我找目标的时间,所以我遇到了第一个问题:如何快速找到由开发者自定义的全局变量?
假如我有一个正常的 window...不对,不用假如,新开一个空窗口不就得了 在新打开窗口的控制台,我得到了这样的结果:
怎么把这 196 个原生的全局变量拿过来呢?复制粘贴就太 low 了,让我想想...
在原有窗口的基础上,再搞一个新窗口...这不就是 iframe 吗!iframe 虽然没有 window ,但是它有 contentWindow ,原则上来说,属性差别应该不大。所以现在只需要创建一个 iframe,拿它里面 contentWindow 的全局变量去过滤当前 window 的全局变量,就可以筛选出那多余的 43 个嫌疑人了。 于是我在控制台敲出了下面这些代码
诶,怎么是** 45 **个?比预期的多了 2 个,难道 window 里面还包含哪些 contentWindow 里面没有的变量吗?于是我把相同的代码拿去 url 为 about:blank
的窗口下执行了一遍,发现了罪魁祸首:
当我凝视着这个飞奔的无敌小恐龙时,我突然觉得...一切变得...