unipus iTEST考试助手---写脚本与反脚本的拉锯战
unipus iTEST考试助手---写脚本与反脚本的拉锯战
0x0 前言
脚本已经失效, 此博客只为记录我的开发历程, 方便大家学习油猴脚本开发
学校的英语考试选择在ITEST平台上进行, 并让我们进行了一次模拟考试, 进入考试后发现无法选中切屏等操作, 不如就写个脚本解除这些限制吧, 马上我同学魔改其他人的脚本加入了翻译等功能, 我就想着不如我也写着试一试吧, 随后就开始了我与ITEST的拉锯战

0x1 1.0版本 — 解除限制
我方进攻
解除限制非常简单, 首先注意到所有的 .itest-ques 均被挂上了false, document document.body 也被限制了, 直接解除这些限制即可

1 | |
0x2 2.0版本 - 自动翻译与解析听力
我方进攻
注意到所有的听力材料都是以json的形式写在了dom里, 只需要遍历这些dom, 就可以将听力的地址提取出来 ITEST开发人员太懒了

翻译题目很简单, 只需要遍历每个题目的节点, 在每个题目上加上按钮, 传入百度翻译即可返回结果, 这里贴上部分代码
1 | |
ITEST方防御
因为不少学校的ITEST平台是定制的, 域名未知, 我不得不匹配所有域名, 为了判断一个平台是否为ITEST, 我才用了判断标题的方法
1 | |
收到失效的报告后, 我进入平台检查, 发现了下面令我瞠目结舌的场面:


他们把ITEST的 T 与 E 替换成了希腊字母 Εε 和 Ττ , 肉眼看不出任何问题, 但是程序不认了, 要不是有拼写检查, 我还真看不出来 ITEST 和 ITΕSΤ 不一样, 你看得出来吗?
0x3 3.0版本 — 解除切屏限制与添加翻译助手
反制防御
因为ITEST被改, 不能判断ITEST, 我将条件删为仅判断节点
1 | |
我方进攻
在逻辑里发现切屏代码, 是通过 window.onblur 与 window.onfocus 检测切屏, 很简单, 我只要把这两个函数置空即可

1 | |
为了方便查单词, 我添加了翻译助手, 大概就是添加了个节点, 点击会直接调用百度翻译进行翻译, 大致源码, 红框内为铺垫

ITEST防御
还记得前面那个翻译助手吗? 就那里出现了大问题, ITEST直接检测了翻译助手的悬浮窗, 如何出现问题直接判定为作弊, 并通过ajax传输出去! 至此, 我不得不修改源码

0x4 4.0版本 - 全随机与ajax拦截
反制防御
为了防止脚本被固定节点检测出, 我决定对脚本进行重构, 对所有的class进行随机化处理, 核心代码如下
1 | |
如此一来, 所有动态插入的内容全随机, 如图


我方进攻
为了防止信息被上报, 我拦截了ajax信息, 对url进行判断, 并选择是否放行, 代码如下
1 | |
ITEST防御
这次防御有点头疼, 首先ITEST去检测了解除限制这一片, 发现如果被置为 true 则判定开了脚本

为了防止ajax被拦截, 他们选择了 fetch , 并提前保存了fetch防止被篡改

最后拦截了ajax, 并采用定时器不断修改ajax, 检测是否访问 api.fanyi.baidu.com

0x5 5.0版本 - 只读属性的胜利
反制防御
iTEST再次更改了节点, 从 all-content 改成了 main-content , 必须得找一个无法被修改的办法, 于是选择检测JS
1 | |
因为检测 oncontextmenu , 只要不返回 false 便可解除屏蔽, 为了万无一失, 我采用了骚操作, 采用定义属性的方式使其返回false, 但是网页却认为不是false, 右键菜单照常, 但是js读一定是false
1 | |

因为对方拦截了ajax, 我要不想被拦截就可以使脚本比他更先运行, 加入注释头 // @run-at document-body 因为此时网页还未载入jQuery, 我得自己加载jQuery // @require https://cdn.bootcdn.net/ajax/libs/jquery/1.11.1/jquery.min.js 随后保存ajax, 使其无法篡改

这样以后调用ajax即可, 对方无法侦测到我使用翻译接口
我方进攻
虽然我承认ajax是我先改的, 但是我现在脚本比你先运行, 那么就可以玩点骚的了, 首先把ajax设为只读, 并采用白名单的形式去检查上报事件是否是我允许的
1 | |
随后拦截 fetch 事件, 使其返回永远是成功
1 | |
0x6 后记
拉锯战到这里就结束了, 因为5.0版本我并没有公开, ITEST无法对我进行反制, 等这篇博客发出来的时候, 我的英语应该已经考完了(滑稽), 不过5.0我也不打算公开了, 通过这次拉锯战巩固了我jQuery框架的知识, 还整会了各种骚操作, 这种东西玩玩就好了, 适时收手, 我可不想收到我的第二封律师函