作弊与反作弊的较量:分屏器真的安全吗?

作弊与反作弊的较量:分屏器真的安全吗?

疫情当前,为了避免人群聚集,不少学校都把考试从线下搬到了线上。
不同于线下,线上监考由于增加了更多不可控因素,如何在尽可能少增加成本的前提下,保证考试的公平公正就成了亟待解决的问题。
近期,有几所学校的老师,相继联系我,希望可以得到相关技术支持。
我计划做一个系列,用尽可能通俗易懂的方式,向大家分享一些作弊与反作弊的知识。
古人云:“知己知彼,百战不殆”,我将站在攻守两方的角度,解释并验证双方的操作,但不会涉及非常详细的实现过程,以免被别有用心的人利用。

现场重现

某校期末考试为学生提供了两个套餐:

套餐一:申请缓考,疫情结束后,统一考试。

这个套餐的特点是,学生依然可以使用最熟悉的方式参加考试,监考也非常容易,不引入其他不确定性因素。但是,谁也不知道疫情持续多久,下学期还有下学期的课,十几门考试堆在一起,除非你记忆力超群,否则上学期的知识不知道还能记得多少。

套餐二:参加线上考试。

选择这个套餐的学生,需要保证在考前确认自己的设备符合监考要求。

学校会培训各班班长,协助学生配置好考试环境,比如安装软件、放置摄像头等等。

设备调试完成后,学生需要保证在完成考试前,考试环境不能改变。

如果设备调试无法通过检查,则只能参加线下考试。

一旦线上考试开始,任何自身原因造成的缺考,按0分处理。


学校会出两套难度基本一致的考卷,并随机分配给套餐一和套餐二,因此不需要担心考题难度和泄露考题的问题。


反作弊方的防范

为了防止作弊,学校制定了详细的设备安装要求。

▼设备安放图示

摄像头1安装于电脑屏幕上方,拍摄屏幕正前方,主要是拍摄学生的面部和身后的情况。

摄像头2安装于学生身体右侧,主要拍摄屏幕和学生双手的操作情况。

两个摄像头都集成有麦克风,需要确保麦克风工作正常。

摄像头1和2均由学校统一采购提供。

考试系统会录制学生答题时的电脑屏幕,并上传,同时记录键盘鼠标操作。

这就基本确保了学生不可能自己通过上网查资料,翻书等方式作弊。

要想作弊,只能通过其他人帮助。

反作弊方曾经想过阻断他人将答案告知考生的渠道,考生获得答案,要么靠眼睛,要么靠耳朵。

耳朵这个途径,尤其难以防御,现在的隐形耳机太多,摄像头无法清晰拍摄出这个细节,而且还有骨传导等骚操作。

于是,防范枪手获得考试题目就成了重点。

除了采购两个摄像头,学校还采购了一个叫防窥膜的东西,要求学生安装于屏幕上,并通过摄像头2,检查防窥膜的效果。

安装了防窥膜后,屏幕从侧面根本看不清,只有正面才能看到。

如果有人想帮助考生作弊,由于摄像头的视野覆盖了整个屏幕正前方,从正前方看题会被摄像头发现,从侧面摄像头盲区看题,防窥膜会让他看不到东西。

可能有人会问,学校采购这些设备的钱是哪儿来的呢?

大部分学生都不知道,你参加线下考试,其实是交过钱的。

因为考试是要花钱的,试卷印刷、场地、监考老师的补贴等等,只是这部分钱是摊入学费的,无需再次支付。

线上考试中,试卷印刷、场地这两项肯定没有了,省下的钱,正好可以采购设备用。

批量采购的成本是很低的,这些加一起都不超过100元/学生。


一定有人想说,不就是个期末考试嘛,用得着这么兴师动众?

在我的印象中,大学期末考试是通过性考试,过了也就过了,我是不是过了,并不影响其他人过不过,不会因为我过了,而有本来应该过的人不能过。

但是学校老师的一席话,让我有了新的认识。

大学也是存在竞争的,这个竞争中,学习成绩占了很大比重。

比如:

  • 保研:挂科不能保研,总成绩高的可以保研。
  • 考研:考研录取并不是你过线就会录取,在过线的基础上,很多教授更愿意要本科成绩高的人。
  • 留学:GPA有多重要,无需赘述。
  • 入党:成绩高者优先。
  • 奖学金:成绩高者优先。
  • 企业联合培养:大企业都会和学校有合作,由学校推荐优秀学生参加联合培养计划,这对日后的发展很有帮助,我当年就是参与了这类计划。

疫情期间涉及在线考试的课程,每个学生少的几门,多的十几门,作弊带来的成绩提升,以及随之而来的种种好处,是极其诱人的。

这也是学校为什么非常重视在线考试作弊问题的原因。


作弊者的阴谋

设备安装要求公布之后,作弊者很快找到了漏洞:双屏。

你不让我看屏幕,好办,我再接一个屏幕不就得了?

基本上电脑都支持连接多个屏幕,现在枪手可以看到题目了。


反作弊方的对策:

由于考试系统是一个客户端软件,我们可以从容使用Windows提供的API来检测电脑究竟连接了多少个屏幕。

学校用的考试系统是C#开发的,我们可以利用ManagementObjectSearcher来检测显示器的数量。

 var monitorCount = new ManagementObjectSearcher("SELECT * FROM Win32_DesktopMonitor").Get().Count

一行搞定,非常清爽,直接做成考试系统的插件,在考试系统启动前做一次检测,并在考试过程中,持续检测上传。


作弊者的反制

反作弊方检测显示器数量的方法,其实是检测电脑连接了几个显示器,如果可以把某种装置连接到电脑上,用它把信号复制一份的话,是不是就可以绕过了呢?

因为电脑上只连接了一根视频线,电脑会以为自己只连接了一个显示器,并把信号送给这个装置,可以在这个装置的内部完成视频信号的复制工作,这真是神不知鬼不觉。

事实上,这种装置是真实存在的,叫分屏器,原来是用于会议室和卖场电视设备展示的。

▼考生用分屏器,复制屏幕内容给枪手。

▼为了证明这种作弊方法确实可行,并寻找检测方法,我专门买来了一个分屏器。

▼它的使用效果是这样的,确实能复制屏幕并绕过检测。


反作弊方的思考

其实反作弊方识别作弊行为的方法,本质上是在找特征。

要寻找有区分度的特征,比如作弊必须要用到,正常考试不必用到的行为。

为了弄清分屏器的工作机制,我拆开了它。

▼这个分屏器掂量着挺重的,拆开一看,原来重量都在铁壳子上,板子很小。

▼核心芯片就一个,IT6661FN。

芯片型号都知道了,果断去官网查资料。

文档里发现了一句话:

An EDID RAM is embedded in IT6661 to save the cost of the external EDID ROMs.

翻译一下就是:IT6661集成了EDID RAM,可以节省外部ROM的成本。

看起来IT6661FN内部存了些东西,也许就可以用来识别分屏器,灵感来了。


EDID是什么东西

EDID是Extended Display Identification Data的缩写,中文名称扩展显示器识别数据。

说白了,就是一些用于描述显示器的数据,比如显示器的厂商、型号、支持的分辨率等等。

大家有没有注意到,当你把显示器连接到电脑的时候,电脑会自动识别显示器支持的分辨率,就是这个EDID在起作用。

▼赶紧查查HDMI的引脚图,第15和16两只引脚,就是用来读取EDID的。

▼通过这两只引脚,尝试读取了下分屏器的EDID,果然有HDMI Splitte字样。

▼按照EDID的格式,解析下,果然,分屏器的显示器名称部分的内容是HDMI Splitte,其实应该是HDMI Splitter,也就是HDMI分屏器的意思。

我想会有人问,为什么Splitter少了个r,其实是因为EDID规范中,显示器名称最多只能容纳13字节,最后一个字节必须是0,标记字符串结束,所以有效字符只有12个,“HDMI Splitte”算上中间的空格正好12个字符。

▼顺手也读取了下陪伴我多年的显示器的EDID,居然5年前的东西就支持4k啦,很爽啊,哈哈哈。


反作弊方的的对策

既然已经找到了合适的特征,下一步就是撸代码了。

我实在太懒,读取和解析用的都是别人的轮子,用到了WindowsDisplayAPI和EDIDParser两个开源项目。

foreach (var display in Display.GetDisplays())
{
        byte[] edidData;
        using (var key = display.OpenDevicePnPKey())
        {
            using (var subkey = key.OpenSubKey("Device Parameters"))
            {
                edidData = (byte[])subkey.GetValue("EDID", null);
            }
        }
    if (edidData != null)
    {
        var edid = new EDID(edidData);
        foreach (var descriptor in edid.Descriptors)
        {
            if (descriptor is StringDescriptor)
            {
                Console.WriteLine(((StringDescriptor)descriptor).Value);
            }
        }
    }
}

代码不复杂,先逐个遍历显示器,读取每个显示器的EDID,解析其中的显示器名称,其实上面检测显示器数量也可以用这段代码。

这个模块同样是作为考试系统的插件,不断把显示器的EDID上传到服务器,配合分屏器名称黑名单即可判断是否使用分屏器,并根据EDID中的信息,识别分屏器的厂商、型号、甚至是序列号。


后记

就在本文写作的几天中,学校陆续组织了几次考试,成功抓获十余位使用分屏器的考生,当老师直接说出他们使用的是什么型号的分屏器时,他们都大惊失色,最终承认了作弊行为。

而我么,功成身退,上知乎,写文章,享受分享知识的乐趣。


作弊与反作弊,就像一枚硬币的两面,必将相伴始终。

我希望所有学生都可以诚信考试,不要铤而走险。

不过嘛,好奇心还是驱使着我,继续探索各种可能的漏洞以及防御方法。


如果你对这方面的知识感兴趣,就点个关注吧,这样就不会错过后续的更新咯。


本系列其他文章:

编辑于 2020-07-19 20:27