python爬虫逆向|某手网页滑块逆向分析

网站链接

这里就不放链接了,某手web端的滑块,清理下cookie就会出

滑块流程

在请求数据的接口内,result出现400002,就是出现滑块了,这里url就是滑块链接

然后取出滑块链接里的captchaSession,去请求config这个链接

就会得到滑块的各种信息,如下图

最后是,请求kSecretApiVerify接口,验证加密参数verifyParam

加密参数verifyParam逻辑

全局搜索verifyParam:,发现只有一处

进到文件内,观察verifyParam,发现是变量a赋值的,a值又是在e[Jt(“0x37”)]这里赋值的,并且值是我没最终想要的,那就好办了,开始看堆栈吧

经过分析,会发现,verifyParam就是根据这些参数加密得到的

{
  "captchaSn": '上面config里的captchaSn',
  "bgDisWidth": 316, # 可以写死,根据config里的值*0.46,四舍五入得来
  "bgDisHeight": 184, # 同上,可以写死
  "cutDisWidth": 56, # 同上,可以写死
  "cutDisHeight": 56, # 同上,可以写死
  "relativeX": '需要自己识别滑块的距离',
  "relativeY": '同上config里的值*0.46,四舍五入,但不可以写死',
  "trajectory": "滑块拖动轨迹",
  "gpuInfo": '显卡信息,可以写死',
  "captchaExtraParam": '浏览器信息和指纹什么的'
}

trajectory

综合而言,只有轨迹信息trajectory是需要知道怎么生成的,其实就是a.slice(1),a值是上方这里生成的

大致跟一下,其实逻辑不难,可以直接py还原下,代码如下。

def trajectory_calculation(trajectory: list):
    """
    快手滑块轨迹计算算法
    :param trajectory: 轨迹,上图c=n[Na("0x124")]的值
    :return: 计算后的轨迹
    """
    r = trajectory[0][2]
    c = ''
    for t in trajectory:
        c += f',{t[0]}|{t[1]}|{t[2]-r}'
    c = c[1:]
    return c

verifyParam

verifyParam加密的入口在这里

主逻辑在这里,首先先把参数c处理下

py可以直接处理,代码如下

from urllib import parse


def 懒得起名了():
  captcha_data = {
      "captchaSn": '上面config里的captchaSn',
      "bgDisWidth": 316, # 可以写死,根据config里的值*0.46,四舍五入得来
      "bgDisHeight": 184, # 同上,可以写死
      "cutDisWidth": 56, # 同上,可以写死
      "cutDisHeight": 56, # 同上,可以写死
      "relativeX": '需要自己识别滑块的距离',
      "relativeY": '同上config里的值*0.46,四舍五入,但不可以写死',
      "trajectory": "滑块拖动轨迹",
      "gpuInfo": '显卡信息,可以写死',
      "captchaExtraParam": '浏览器信息和指纹什么的'
  }
  captcha_str = ''
  for k, v in captcha_data.items():
      captcha_str += f'&{k}={parse.quote(str(v))}'
  return captcha_str[1:].replace('/', '%2F')

还是这张图,看处理逻辑,i就是上面py处理过的captcha_str,先h(i)赋值给o,在x(o)

一个个看,先h(i),还是蛮简单的,扣下来运行或者py还原下都可以

处理好得到第一个大数组,赋值给o

再看x(o),e是刚才的o,l是一个固定值

往下跟,发现到了一个加密文件里,可以把这个文件直接拿出来

这里先暂停,回溯一下,看看Jose是什么,如图

搜下Jose,发现是在加密文件里的这个o()

然后根据逻辑处理下加密文件,删除一些无用的函数,和对node检测的代码,也就是上图的这一大行,改成如下

然后下方,自己写个函数照抄就好,这里注意js里的Promise是要用then接收值的,得到了第二个大数组,也是就上面的x(o)

最后就是加密结果了,u就是刚才的大数组,e.from(u).toString(‘base64’),就是最后的加密结果了

最后的加密结果想跟的可以跟一下,就是根据Uint8Array,ArrayBuffer的一些操作,和环境检测,不想跟的话,直接node里new Buffer.from(u).toString(‘base64’),结果是一样的


结束,撒花

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AJackpot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值