入微-极验第四代滑块验证码系列二

该系列文章仅限于某验滑块研究,不会公开具体算法源码,欢迎讨论
本文关联文章:
纵观
入微
芥子
浩瀚

一. 观察verify请求

  1. 我们看一下verify请求的Initiator,可以观察到全是来自于gcaptcha4.js这个文件,所以该文件也是我们此次的目标所在
  2. 点开gcaptcha4.js这个文件,格式化完,13339行,嗯,真的是混淆他妈给混淆开门,混淆到家了
  3. 这时候我们有两种选择,硬刚或者AST,我这里用的是AST还原js文件,然后再使用chrome伤的reres插件把混淆的js替换掉,再来一步一步调试。这里的AST代码我放在了github上面,插件reres的安装以及使用各位自行谷歌。AST还原代码
  4. 做到下面这个效果,就算替换成功了

二. 定位w参数加密位置

  1. 搜索w,我们这里根据经验可以搜索以下关键词来定位
w 或 .w 或 'w' 或 "w"
  1. 这里搜索"w"有我们想要的返回,我们在2527行打上断点,可以看到w的值r在2525行定义,我们也打上断点,刷新一下,成功断上,至此我们已完成w参数的加密位置定位

三. 分析w参数加密算法

  1. 简化参数w的值r的定义
var r = (0, d["default"])(l["default"]["stringify"](e), a)
等价于,其原理是js的逗号操作符对它的每个操作对象求值(从左至右),然后返回最后一个操作对象的值
var r = d["default"](l["default"]["stringify"](e), a)
等价于,其原理均是js获取对象的属性
var r = d.default(l.default.stringify(e), a)
  1. 分析l.default.stringify(e)含义

    可以看出此处就是对e进行json序列化操作

  2. 分析d.default(l.default.stringify(e), a)含义

    跟进d函数
    我们先对里面的几个条件判断处打上断点,

    调试到最后一处,前往console处打印一下值,可以得出下面结论
function a(e, t) {
    var s = t["options"];
    // !s["pt"] || "0" === s["pt"] 为false,恒不执行
    if (!s["pt"] || "0" === s["pt"])
        return r["default"]["urlsafe_encode"](e);

    // "1" === s["pt"]为true,恒执行
    if ("1" === s["pt"]) {
        var n = (0,
        c["guid"])()
          , a = new _["default"]()["encrypt"](n);

        // !a || 256 !== a["length"]为false,恒不执行
        while (!a || 256 !== a["length"])
            n = (0,
            c["guid"])(),
            a = new _["default"]()["encrypt"](n);

        var o = i["default"]["encrypt"](e, n);
        return (0,
        c["arrayToHex"])(o) + a;
    }
}
等价于
function a(e, t) {
    var n = c["guid"])(), 
        a = new _["default"]()["encrypt"](n);
        o = i["default"]["encrypt"](e, n);
    return c["arrayToHex"])(o) + a;
}

我们到这里可以确定参数t并没有被使用,参数e就是w的明文,我们接着分析json序列化之前e的成分

  1. 继续分析e的组成
{
    'device_id': 'A8A0', # 固定值
    'em': { 
        'cp': 0,
        'ek': '11',
        'nt': 0,
        'ph': 0,
        'sc': 0,
        'si': 0,
        'wd': 1,
    }, # 固定值
    'ep': '123', # 固定值
    'geetest': 'captcha', # 固定值
    'fq6a': '1925502591', # 固定值
    'lang': 'zh', # 固定值
    'lot_number': '7e22264d4f3e4dd8a6ffbf6e82e1122d', # load请求返回值
    'passtime': 166, # 通过时间
    'pow_msg': '1|0|md5|2022-03-25T14:23:36.364152+08:00|24f56dc13c40dc4a02fd0318567caef5|7e22264d4f3e4dd8a6ffbf6e82e1122d||29f07cebf938aa4e', # load请求返回加上某算法返回值,后面再分析
    'pow_sign': '2b47a3a9425dd19dd5abf902c8bb0763', # pow_msg的md5值,为何是md5,写在了pow_msg上
    'setLeft': 88, # 滑动距离
    'track': [[38, 18, 0], [1, 0, 33]......], # 轨迹
    'userresponse': 87.47978686742837 # 某算法返回值
}

4.1 pow_msg和pow_sign我们放一起分析

搜索pow_msg,全部打上断点,刷新,然后保留成功断上的断点
u = n + "|" + a + "|" + s + "|" + o + "|" + t + "|" + e + "|" + r + "|"
# 上面n、a、s、o、t、e、r的值则来自load请求的response中
p = (0, b["guid"])()
g = u + p
pow_msg = u + p
pow_sign = md5(g)

我们还需要分析下b.guid()是什么算法,继续跟进

var a = function () {
    function e() {
      return (65536 * (1 + Math["random"]()) | 0)["toString"](16)["substring"](1);
    }

    return function () {
      return e() + e() + e() + e();
    };
}();

t["guid"] = a;

4.2. set_left、track、passtime、userresponse

set_left为滑块移动距离取整
track为移动轨迹,从第二步开始,是上一步的相对移动距离(x, y, t)
passtime为总移动时间
userresponse为set_left / (0.8876 * 340 / 300)

  1. 到这里我们已经把w的明文分析出来了,又到了show code环节了

四. 结语

我们还剩set_left、track、passtime三部分,也就是滑块的缺口距离识别,滑动轨迹的构造,滑动耗时,这个我们放到下一篇文章再分析,当然也包括函数a(e, t)中的重头戏:c.guid()、_.encrypt()、i.encrypt()、c.arrayToHex()四个函数
芥子

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343