个人网站: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”。
从此它成为了全网最“快乐”的一只小恐龙