作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!


1、接口分析

网站:aHR0cHM6Ly93d3cuZ2F0ZS5jb20vemgvbG9naW4=
进入网站登录页面使用手机号登录,随便输入后点击登录,滑动滑块,发现有两次load和verify的抓包,分别是 无感ai和滑块。

captcha_id: 固定值 (后面所有请求用同一个)
所有的callback: geetest_ + 时间戳
load
     参数:
        callback: geetest_ + 时间戳
        challenge: uuid 可固定
     返回:
        lot_number、 payload、 process_token、 pow_detail
load得到的lot_number: 后续所有请求用同一个

verify 
    参数:
        payload: load返回的值
        process_token: load返回的值
        w
    返回:
        lot_number、 payload、 process_token

load
    参数:
        payload: verify返回的值
        process_token: verify返回的值
    返回:
        pow_detail、 bg缺口图片链接、 payload、 process_token
        captcha_type为nine: 前面的verify校验不通过(w动态参数问题)

verify
    参数:
        payload: load返回的值
        process_token: load返回的值
        w
    返回:
        result为success则验证通过



2、w参数

搜索 w: 找到w参数加密位置,位置如下:

发现w由_ᕸᖆᖚᕿ赋值得到,_ᕸᖆᖚᕿ由_ᕸᖆᖚᕿ加密得到,跟进_ᖆᖚᕾᕺ[_ᕸᕺᖂᖗ(183)]函数中。

判断依据:rsa的模数和指数,n和e;aes的key 长度 16 字节、CBC 模式、32 轮密钥扩展,16字节的key和iv只有aes。

传入的字符串分析:
        713a:动态字符串,通过对lot_number的切割得到。
        W4Ec:  生成来源于window['_lib'] (可固定)

        bith:通过gct4.xxx.js中的两个函数作为字符串计算得到 (几乎不变动,可固定)

        pow_msg:  load请求在返回的pow_detail + captcha_id + lot_number + 16随机字符串
        pow_sign:  pow_msg加密得到,加密方式取决于pow_detail返回的结果

跟栈分析713a,713a就是i,流程:lot + lot_number运算得到i,lotRes+lot_number得到o,i切割得到r,r进一步运算得到最终的i。

def dynamic_params(arr1, arr2, lot_number):
    def slice_segment(seg, s):
        if len(seg) == 1:
            return s[seg[0] + 1:]
        return s[seg[0]: seg[1] + 1]

    def extract_by_rule(arr, s):
        res = []
        for item in arr:
            if not isinstance(item[0], list):
                res.append(slice_segment(item, s))
            else:
                res.append(''.join(slice_segment(seg, s) for seg in item))
        return res

    data1 = extract_by_rule(arr1, lot_number)
    data2 = extract_by_rule(arr2, lot_number)[0]
    result = {}
    cur = result
    for idx, key in enumerate(data1):
        if idx == len(data1) - 1:
            cur[key] = data2
        else:
            cur = cur.setdefault(key, {})
    return (data1[0], result[data1[0]])

lot和lotRes位置

跟栈分析:pow_msg、pow_sign,通过堆栈一直往上找。

跟进_ᖙᖄᖃᖚ[_ᖗᖗᖘᕾ(183)]函数,(传入的字符串 + 随机16位字符串)加密得到的就是pow_sign。

3、总结

1、一共3种算法rsa、aes、md5,全部是标准算法,可以直接调库实现

2、就算第一次的无感ai验证返回正常,但是第二次的load出现了nine,那一定是前面的verify参数出现了问题。

3、缺口距离:在你识别准确的结果还需要再减去一个值,这个值是滑块图片的空白距离

4、md5的加密结果必须是000开头的

5、构建上面的那个用于aes加密的字符串时必须要注意空格问题。

4、结果展示

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐