金手指/魔术指
到底是什么?🤔
SAT 金手指(或“魔术指”),是一种相对较新的 SAT 软件类作弊方法。其实际效果是当考生的鼠标光标悬停在正确答案之上时,原本的“单指”光标会被替换成“双指”光标,以标注正确答案。
下面是某机构的技术展示视频:
这个方案 ELPIS 。。。。。。
Bluebook 的本质是什么?
👋金手指☝️是如何实现的?
Bluebook 本质是一个基于 Electron 框架的安全浏览器。对,本质上,Bluebook 就是一个受到监控的、被锁定了的、被限制了大部分功能的浏览器!而你所看到的试题(或者任何页面),其实本质上都仅仅是一个个网页,只是这些网页只能通过 Bluebook 访问,不能通过普通浏览器访问。
那么 Electron 框架又是什么呢?Electron 是一种开发桌面应用的工具,它可以把原本在网页中运行的内容,包装成能安装在 Windows、macOS 和 Linux 上的软件。简单来说,就是用开发网站的技术来制作电脑软件。
有不少耳熟能详的软件都在使用 Electron 框架。比如 Discord、Notion、Slack、WhatsApp 等等。
既然考试软件的“本体”是网页,只要我们可以设法接触到它的“三件套”,我们就可以将这个网页改成任何我们想要的样子,做任何我们想做的事!网站的“三件套”有:
- HTML 代码:定义网页有什么——标题、文字、图片、按钮、表单等,也就是内容和结构。
- CSS 代码:定义网页长什么样——颜色、字体、大小、间距、布局、动画等,也就是样式和视觉效果。
- JavaScript 代码:定义网页如何响应和变化——点击按钮、弹窗、表单验证、动态加载内容等,也就是交互和行为逻辑。
当你访问一个网站的时,你会从网站服务器收到“三件套”,然后你的浏览器会根据“三件套”里的代码,将网站在你的电脑上“渲染”出来。
如果你从未接触过这些概念,也没有关系。你可以把网页想象成一道菜:当你访问一个网页时,就像是在向服务器询问“这道菜该怎么做”。服务器会把菜谱——也就是 HTML、CSS 和 JavaScript——交给你的浏览器,再由浏览器按照菜谱把这道菜做出来,最终呈现在你眼前。
需要注意的是,你从服务器收到的通常是“菜谱”,而不是已经做好的“菜肴”。在现实世界中,同一份菜谱交给不同的人,做出来的味道和样子可能大不相同;但在计算机世界中,浏览器会按照明确的规则执行代码,因此同一份“菜谱”交给不同的计算机或主流浏览器,呈现出来的网页通常几乎完全一致。
那么问题来了
谁规定我一定要按照你给的菜谱做饭?我收到了你的菜谱,我觉得你盐用的太多了,我就想减去一半!甚至,我更喜欢甜口的,我就要把你菜谱里所有盐都换成糖!总而言之,今天我必须修改你的菜谱,然后再按照修改版本做出来吃!
“修改菜谱”这件事在前端程序员的世界里很普遍,而且在开发中非常实用,甚至普通的浏览器中就自带“修改菜谱”的功能。以 Chrome 浏览器为例,打开“开发者工具”,你就可以看到你的浏览器收到的“菜谱”。
我们打开 SAT 官网,看看它的菜谱是啥?
我们来尝试修改一下菜谱。比如 What’s on the SAT 这句话,我希望改成 What’s NOT on the SAT。
我们在菜谱中找到这句话的对应位置。
加上一个 NOT!回车!搞定!
插一句,正是因为菜谱如此容易被修改,所以我们才并不乐意发一堆成绩截图去展现战果。你猜猜机构小红书上、朋友圈里的“出分案例”,有多少是这么来的?
总之同理,Bluebook 里的“考试网页”也可以像这样被修改。我们只需要加入一段代码,代码的逻辑是:
- 通过某种方法获得正确的选项(可能是考手提供或者是从很有趣的地方直接拿到的)
- 定位页面上正确选项的位置
- 当检测到鼠标移动到正确选项上时,将鼠标的图标替换成一个自定义图标
难点是,Bluebook 里可不给你提供类似“开发者工具”这么便利的“修改器”。甚至,Bluebook 严格封锁任何可以打开“修改器”的渠道!比如说,理论上通过命令行打开 Bluebook 时,只要加入 ——inspect 参数,即可强制打开“修改器”。但是实际上,Bluebook 会对自身参数做检测,如果检测到 ——inspect 参数,程序会立即自杀。
不过利用一些“特别手段”,依旧可以”强开” Bluebook 的“修改器”。ELPIS 实验过并且成功的方式就不下 4 种,理论上还有更多。
🤔那我们为什么
❌ 不用🙅
金手指/魔术指呢?☝️
当然是因为不能保证安全!
专业点讲。
Bluebook 的安全机制是多维度的。我们当然可以通过反编译拆解所有 Bluebook 本身的、自带的安全模块,但是我们不能排除某些安全策略是考试时动态下发的。
让我们来说人话。
还是回到菜谱的例子。Bluebook 本身可以提前下载、可以提前拆解、可以提前研究透彻,但是考试页面的菜谱肯定是在考试时当场发给考生,不会提前发!如果某次考试中,CB 决定修改菜谱,比如在最后加了一句:做完这道菜后,拍个照发给我。
哦吼!CB 就会发现,为啥只有你做出来的菜和别人的不一样?为啥只有你的菜有两根手指!
监考官/审核员视角 be like:
😊
😊
😊
😊
😊
☝️😭☝️
以上只是个比喻,现实中,有太多太多可以用来检测网页端是否被修改的办法。比如一个叫 MutationObserver 的浏览器原生提供的 JavaScript API 函数,它可以监听网页属性变化、子元素增加或删除、文字节点变化、所有后代元素变化,等等。只需要调用 MutationObserver,如果检测出网页有变化,直接上报 CB 即可。
甚至就算不从代码的角度考虑,Bluebook 目前是有能力对考试进行录屏的,只是录屏功能仅在少数情况下开启。比如,SAT 的监考官可以通过监考平台实时查看考生的电脑屏幕和作答画面。
如果考试的时候某位幸运的考官打算看看你的答题情况,并且你又很不幸的恰好露出了两根手指,猜猜谁是今天的小丑~
我们可以再换一种检测方式,我们甚至无需关心页面是否被改动,只需要周期性的检查“修改器”(inspector/remote debugging)是否被“强开”即可。因为 CB 官方是绝无任何可能把“修改器”开放给考生的,如果在考试中检测到“修改器”被打开了,那一定是有人在“强开”。
To sum up...
两句话总结。
这种方案之所以暂时没有被大规模取消成绩,最大的根因是:College Board 犯懒。明明加 3-5 行代码就能顺手检测的事情却没做。
这种方案最大的风险在于:存在多种、多维度的、并不复杂的检测途径,并且大部分检测方法可以嵌入进“菜谱”。意味着不到考试开始的那一刻,没人知道会怎么检测,无法提前防御。
综上,这种方案 ELPIS 并不使用。也不太明白为什么有些机构给这种方案的定价反而更高。摊手。
我们做了 CB 没做的
为了更加直观的展示 CB 可能部署的、用来检测“基于修改网页(菜谱)”的作弊技术,我们自己实现了一个纯前端的检测。
假设下面就是考试页面,你可以试图用浏览器自带的“修改器(inspector/developer tools)”对下面的内容进行修改,看看是否会被我们抓到。
注意!我们只监控了“模拟考试区域”中的内容是否被修改,不监控本页面的其他内容。所以只有修改下面方块中的内容才能触发检测哦!修改其他地方是无效的哦!
操作方法
请使用主流浏览器打开本页面,推荐使用 Chrome、Edge 或 Safari。 你可以按照下面两种方法测试网页修改检测功能。
A 打开开发者工具
-
打开浏览器的开发者工具:
- Windows:按 F12,或者按 Ctrl + Shift + I。
- macOS:按 Command + Option + I。
- 你也可以右键点击网页,然后选择 “检查”或“Inspect”。
- 开发者工具打开后,系统将尝试检测该行为。
- 如果检测成功,页面会立即显示红色告警弹窗。
B 修改网页 DOM
- 打开开发者工具并进入 Elements 面板。
- 在 HTML 结构中找到标题为 “模拟考试区域”的区域。
- 修改其中的文字、HTML 元素、class 或其他属性。
- 检测到网页被修改后,页面会立即显示红色告警弹窗。