Chrome的小恐龙被我“开挂”了,看我如何用一行代码让它拥有不死之身

个人网站:www.dzyong.top

微信公众号:关注《前端筱园》,不错过每一篇推送

作为一个开发人员,用到的最多的就是Chrome浏览器。

当没有网的时候打开浏览器就会看到下面这个界面。

当按下空格键键时,猛然发现,这竟然是一个游戏。

作为一个程序员的我,如何忍受得了规规矩矩的去玩呢,如果给它一个不死之身,那岂不是可以一直快乐下去。

那该从何下手呢,它的本质是一个网页,那肯定离不开JS。如果这个游戏的变量被设置为全局变量,那么我就可以通过重写它的一些函数来改变游戏规则,从而达到开挂的目的。

说干就干,F12打开控制台,先看看有哪些全局变量。

我的妈妈呀,252个,这么多。但是这些肯定不全是这个游戏的,大多都是window原有自带的。那么如何来筛选出与“小恐龙”相关的全局变量呢。

在浏览器中访问“about:blank”,bout:blank是打开浏览器空白页的命令。在这个页面中打印一下全局变量。可以看到总共196个。也就是说共有252-196=56个是属于“小恐龙”的。

虽然这种方式可以找到我们想要的全局变量,但是如果要一个一个的去对的话,做起来也是相当的繁琐。有什么方法可以直接打印出想要的结果呢。

这里可以使用iframe,假设我们把一个空白页以 iframe 的形式嵌入到“小恐龙”的页面中,使用iframe.contentWindow 方法可以以HTML对象来返回iframe中的文档,然后再使用整个页面的全局变量去过滤掉iframe中的全局变量,那么剩下的就是“小恐龙”的了。

(function() {
    const kl = []
    const iframe = document.createElement('iframe')
    iframe.onload = function(){
        const iframeKeys = Object.keys(iframe.contentWindow)
        const windowKeys = Object.keys(window)
        windowKeys.forEach(function(key) {
            if(!(iframeKeys.includes(key))){
                kl.push(key)
            }
        })
        console.log(kl)
    }
    iframe.src = 'about:blank'
    document.body.appendChild(iframe)
})()

输出内容如下:

结果是拿到了,但是为什么是58个呢,明明之前计算出来是56个才对。把刚才的iframe放在空白页中来试试看。

果不其然,这两个是 contentWindow 比 window 多的两个变量,具体干什么的我也不清楚,这里也就不管它了。来看看剩下的全局变量,根据这些名字可以很明显的看出都是与“小恐龙”相关的,其中很多都是canvas相关的,这个“小恐龙”也正是canvas来绘制的。

找到了这些变量有什么用呢,很明显这都都是对游戏的一些判断、操作的函数封装。比如说Runner应该就是让小恐龙“奔跑”。那么必然会存在一个判断游戏是否结束的函数。

我最先看到的是"GameOverPanel"这个全局变量。我把它输出并查看了一下这个函数内容,发现它并不是判断游戏是否结束函数,看起来应该是显示游戏结束后的一个界面面板。

英文不太好的我去百度翻译了一下不认识单词,找到了罪魁祸首checkForCollision。

这就相当明显了,毫无疑问肯定是检测“小恐龙”是否与障碍物碰撞,一旦碰撞游戏就结束。同样来看看这个函数内容。这次保准没错了。

找到了判断游戏结束的函数,接下来就简单了,反手用个空函数去覆盖原来的内容,按道理这样就永远不会检测到碰撞了。

让我的“小恐龙”跑起来试试,哈哈,它果然获得了“不死之身”的“buff”。

从此它成为了全网最“快乐”的一只小恐龙

发布了72 篇原创文章 · 获赞 75 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/DengZY926/article/details/104924133