基于行为式验证的GeeTest验证码研究

什么是行为式验证

  行为式验证的核心思想是利用用户的“行为特征”来做验证安全判别。整个验证框架采用高效的“行为沙盒”主动框架, 这个框架会引导用户在“行为沙盒”内产生特定的行为数据,利用“多重复合行为判别”算法从特指、视觉、思考等多重行为信息中辨识出生物个体的特征, 从而准确快速的提供验证结果。

  通过机器学习,深度学习对人的行为特征进行大量的分析。建立安全模型去区分人与机器程序。利用深度学习构建的神经网络是可以不断地自主学习的,在不断的验证过程中不断的学习新的特征分析。

  • 通过模型分析,红色是恶意程序,绿色是正常用户,我们可以清晰的分辨出来,说明人与机器程序在网络世界的行为是具有很大的差距的。

GeeTest是如何验证的

  显而易见,GeeTest的验证方式类似于拼图,通过鼠标拖动使滑块图片与背景图的缺口部分重合,形成一幅完整的图片,从而完成了GeeTest的验证过程。这就构建起了GeeTest行为式验证的“行为沙盒”,而用户使用鼠标拖动滑块的动作就是GeeTest行为式验证在这个“行为沙盒”中所要侦测的具体的行为。

  那么问题来了,GeeTest又是如何通过鼠标拖动这一简单的动作来区分是人为的还是恶意程序的呢?要知道实现鼠标动作,对于开发人员来说,简单的一个脚本就可以搞定。

鼠标行为特征

  利用鼠标消息钩子截获到的数据样本内容如下表所示,表中每一行表示所截获到的一个鼠标输入数据点信息。

消息类型 X轴坐标 Y轴坐标 时间戳
512 359 295 419556140
512 358 295 419556171
513 358 295 419556281
514 358 295 419556390
512 358 295 419556562

  通过数据样本可知采集的鼠标输入数据都是按时间顺序排列的4 维数据集合:InputData={(typei, xi, yi, timei)},i表示第i个数据点。

  • typei表示鼠标消息类型,描述了鼠标操作事件类型,如左键按下,右键弹起,滚动,移动等。
  • xi和yi分别表示鼠标输入数据点在屏幕坐标系中的绝对坐标,取值范围和屏幕分辨率对应。
  • timei为输入数据点的高精度时间信息。

  由此可以提取鼠标 移动速度、移动加速度、移动偏移量、移动持续时间、点击时间间隔的统计量这 5 类特征。

移动速度

  在人机交互过程中,鼠标移动的轨迹通常不是直线,鼠标在移动方向和垂直移动方向都有位移。单点的速度方向并不总是和移动方向一致,有时甚至偏差很大。将单点的速度v分解为移动方向的速度和垂直移动方向的速度。对于水平移动,计算水平方向上的速度, 第j个数据点的速度定义为当前数据点和前一数据点水平坐标之差除以它们的时间戳之差。类似地,可以计算出垂直速度。

移动加速度

  加速度的计算使用已经计算出来的速度值,加速度方向和速度方向一致。第 j 个数据点 的加速度定义为当前数据点和前一数据点速度之差除以它们的时间戳之差。

移动偏移量

  对于水平移动,计算垂直方向上的偏移量,第j段移动的偏移量定义为移动轨迹中,每相邻数据点的垂直坐标之差绝对值的求和。类似地,对于垂直移动,计算水平偏移量。对于斜线方向移动的处理也需要先进行坐标变换。

移动持续时间

  一次移动的持续时间是一次移动中首尾两个数据点的时间之差。

点击时间间隔统计特征

  一次人机交互会话中的点击时间间隔统计特征包括鼠标单、双击时间间隔(包括单击持续时间、双击中两次单击持续时间,间隔时间和双击持续时间)的均值和方差。

  根据以上的鼠标行为特征就能进行计算机用户的身份识别,同时也就能区分出到底是人还是恶意程序在进行鼠标的操作,当然简单的依靠这些特征来还无法直接检测用户身份,需要经过一些特殊处理,比如利用特征的距离度量等手段来进行进一步的处理,这些都不是本文说关注的,如果有兴趣的同学可以自行的搜索相关内容。

GeeTest的鼠标行为侦测

  为了方便,文本主要针对GeeTest的Web端进行分析,帮助大家来了解GeeTest的整个验证过程,首先我们从GeeTest官网下载了geetest-java-sdk,部署好之后直接访问demo页面,如下图

  利用开发者工具,查看GeeTest验证过程中的网络请求过程

  发现在GeeTest的验证过程中,产生了http://api.geetest.com/ajax.php这样一个请求,具体的请求参数如下:

  请求响应的结果:

  由此可知,ajax.php就是GeeTest客户端验证的请求,GeeTest就是通过ajax.php请求接口来验证用户的行为的,那么ajax.php的这些参数是如何产生的,它们都代表什么意思呢?这就要从geetest.js中去寻找答案了。

  geetest.js是GeeTest web客户端最核心的组件,通常geetest.js都是被压缩处理过的,这都是小问题,使用专门的工具格式化下,剩下的就靠着耐心来阅读分析啦,经过一番折腾在geetest中找到了下面这段代码:

  这不正是GeeTest客户端验证ajax.php请求的过程嘛?经过源码分析,终于搞清楚这些参数的具体含义:

  • gt :GeeTest为每个应用所分配的唯一ID
  • challange :GeeTest此次验证的唯一吗,每次刷新都会变化
  • imgload :GeeTest图片加载时间
  • userresponse : 与鼠标的移动偏移量和challange有关的
  • a :鼠标的移动路径

  下面我们来详细分析下这些参数的产生过程:首先我们来分析下鼠标的移动路径a,可能有些人纳闷,从前面的请求参数截图来看,a是一长串的奇怪的字符串,怎么会跟鼠标的移动路径有关呢?

  如上图,红色的框中的代码是我自己添加上去的,目的是在console中打印出该方法的入参,我们看下这个参数会是什么

  这不跟前面提到的鼠标行为特征4维数据集合很像嘛?这个就是鼠标的路径?在这里可以明确的说,这就是鼠标的路径集合,由于GeeTest只侦测鼠标的拖动行为,所以4维数据集合中的typei就可以不用记录了,有了这个路径数据,GeeTest就可以侦测鼠标行为特征了。。。

  至于最后如何将鼠标的路径集合转化为那个奇怪的字符串,在上面截图的js代码中的那些方法就是具体的实现了,只要你认真的阅读下,就能搞定了。。。

  看到这,你是不是想到什么啦?如果我们能够模拟出整个鼠标路径的话,那是不是就能够通过GeeTest的验证?嗯,确实可以哦,只要你有一定的算法能力,根据上面鼠标的行为特征就能模拟出鼠标的路径来,不过有一点说一点,GeeTest肯定是使用了深度学的神经网络来进行人机识别,这就要看你的算法能力有多强了,或者更牛X点的,你也可以利用机器学习来模拟哦!

GeeTest图片滑动

未完待续 。。。

  由于,本文只是研究GeeTest的验证过程,只能给大家提供个思路而已,至于破解的代码,就不方便贴出来,毕竟这涉及到侵权的问题,如果大家有兴趣,欢迎访问http://www.cleverli.cn/captcha.html,诚邀有兴趣者参加。。。

猜你喜欢

转载自blog.csdn.net/ieternite/article/details/51483491