最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

快手滑块逆向分析

IT圈 admin 5浏览 0评论

快手滑块逆向分析

目标URL:

aHR0cHM6Ly9wYXNzcG9ydC5rdWFpc2hvdS5jb20vcGMvYWNjb3VudC9sb2dpbi8/c2lkPWt1YWlzaG91LndlYi5jcC5hcGkmY2FsbGJhY2s9aHR0cHMlM0ElMkYlMkZjcC5rdWFpc2hvdS5jb20lMkZyZXN0JTJGaW5mcmElMkZzdHMlM0Zmb2xsb3dVcmwlM0RodHRwcyUyNTNBJTI1MkYlMjUyRmNwLmt1YWlzaG91LmNvbSUyNTJGYXJ0aWNsZSUyNTJGcHVibGlzaCUyNTJGdmlkZW8lMjUzRm9yaWdpbiUyNTNEd3d3Lmt1YWlzaG91LmNvbSUyNnNldFJvb3REb21haW4lM0R0cnVl

此处iframe新开一个窗口,可以减少其他的干扰

失效的话,将上面的重新获取一下,重新复制iframe的URL,进去就可以了

验证不通过


验证通过

检验URL和参数

全局搜一下参数verifyParam

c参数是一个做了加密的长字符串

此处需要注意,当我断在6374的时候,c还是undefined


F8运行到6394的时候,他的值就计算出来了

回到case为0处,有个r对象,其中有个trajectory参数,大概猜测是路径加密后的值,可以先从这里入手

全局搜索一下参数“trajectory”

此处搜到了3个,分别下断点,拖动之后,最后是断在行号 8863 的这个

结果是经过一个参数 c.slice(1)

此处是他的拖动路径数据

此处c的计算在这个位置

此处为指纹hash

到这一步,就可以把路径算法扣下来,路径还原结果如下


const t = {trajectory: [[0, 22, 1664078425847],[7, 22, 1664078425857],[25, 20, 1664078425864],[50, 18, 1664078425875],[79, 17, 1664078425881],[108, 15, 1664078425891],[141, 13, 1664078425898],[170, 11, 1664078425904],[199, 9, 1664078425911],[228, 8, 1664078425918],[257, 7, 1664078425926],[289, 5, 1664078425934],[315, 4, 1664078425942],[333, 3, 1664078425950],[355, 3, 1664078425958],[369, 3, 1664078425966],[384, 3, 1664078425976],[398, 3, 1664078425985],[413, 3, 1664078425990],[423, 3, 1664078425997],[431, 3, 1664078426007],[438, 3, 1664078426014],[449, 3, 1664078426023],[452, 3, 1664078426030],[456, 3, 1664078426036],[460, 3, 1664078426044],[467, 3, 1664078426052],[471, 3, 1664078426211]]
}
let n = {}const f = {uhUaq: function (n, t) {return n - t},FuwxQ: function (n, t) {return n + t}
}let r = t.trajectory[0] ? t.trajectory[0][2] : 0let c = t.trajectory.slice(-100).reduce(function (n, t) {return f.FuwxQ(n,','.concat(t[0], '|').concat(t[1], '|').concat(f.uhUaq(t[2], r)))
}, '')console.log(c.slice(1))

本地结果和浏览器验证结果匹配,说明算法没有扣错

然后我们再回到之前的这个位置,目前已经把路径的参数给解决了,还剩下 captchaExtraParamcaptchaSngpuInfo

在这个位置下断点,当 case0 执行完之后,t 参数的 sent 会把最后的计算结果算出来并赋值


这里hook去跟一下


跟到这里的时候,Shift+F11

在此处下断点,重新刷新,进到f函数里面

进到这里之后,F8运行,观察 n 形参的变化

n变量的变化是这样的
1、先是UA和指纹信息

2、然后是会传一个超长的数组

3、最后就是运算出结果

当n出现数组的时候,F11进入,会进到这个位置,这里就是最后结果生成的地方

以下是每个值的参数和输出的结果

到了断点位置,
先执行完 u = e[i(“0x32”)],可以看到e的输出是一个大数组
然后执行e[i(“0x33”)](i(“0x34”), ni(“0x35”)i(“0x36”));
最后e里面的参数就计算出来了

所以我们只需要在这个地方注入我们需要的代码就可以,
然后将**c.a[i(“0x31”)],d,e[i(“0x33”)](i(“0x34”), ni(“0x35”)i(“0x36”))**导出到全局,然后rpc调用,或者你也可以扣代码,我这里是直接自己写一个WSS去调算法,想扣代码的大佬自己去扣,这里就不多废话了。

最后本地验证一下,成功获得凭证数据

补补补补补补补:

captchaSn参数是来自这个接口的返回数据

captchaSession参数又是来自上一个接口

快手滑块逆向分析

目标URL:

aHR0cHM6Ly9wYXNzcG9ydC5rdWFpc2hvdS5jb20vcGMvYWNjb3VudC9sb2dpbi8/c2lkPWt1YWlzaG91LndlYi5jcC5hcGkmY2FsbGJhY2s9aHR0cHMlM0ElMkYlMkZjcC5rdWFpc2hvdS5jb20lMkZyZXN0JTJGaW5mcmElMkZzdHMlM0Zmb2xsb3dVcmwlM0RodHRwcyUyNTNBJTI1MkYlMjUyRmNwLmt1YWlzaG91LmNvbSUyNTJGYXJ0aWNsZSUyNTJGcHVibGlzaCUyNTJGdmlkZW8lMjUzRm9yaWdpbiUyNTNEd3d3Lmt1YWlzaG91LmNvbSUyNnNldFJvb3REb21haW4lM0R0cnVl

此处iframe新开一个窗口,可以减少其他的干扰

失效的话,将上面的重新获取一下,重新复制iframe的URL,进去就可以了

验证不通过


验证通过

检验URL和参数

全局搜一下参数verifyParam

c参数是一个做了加密的长字符串

此处需要注意,当我断在6374的时候,c还是undefined


F8运行到6394的时候,他的值就计算出来了

回到case为0处,有个r对象,其中有个trajectory参数,大概猜测是路径加密后的值,可以先从这里入手

全局搜索一下参数“trajectory”

此处搜到了3个,分别下断点,拖动之后,最后是断在行号 8863 的这个

结果是经过一个参数 c.slice(1)

此处是他的拖动路径数据

此处c的计算在这个位置

此处为指纹hash

到这一步,就可以把路径算法扣下来,路径还原结果如下


const t = {trajectory: [[0, 22, 1664078425847],[7, 22, 1664078425857],[25, 20, 1664078425864],[50, 18, 1664078425875],[79, 17, 1664078425881],[108, 15, 1664078425891],[141, 13, 1664078425898],[170, 11, 1664078425904],[199, 9, 1664078425911],[228, 8, 1664078425918],[257, 7, 1664078425926],[289, 5, 1664078425934],[315, 4, 1664078425942],[333, 3, 1664078425950],[355, 3, 1664078425958],[369, 3, 1664078425966],[384, 3, 1664078425976],[398, 3, 1664078425985],[413, 3, 1664078425990],[423, 3, 1664078425997],[431, 3, 1664078426007],[438, 3, 1664078426014],[449, 3, 1664078426023],[452, 3, 1664078426030],[456, 3, 1664078426036],[460, 3, 1664078426044],[467, 3, 1664078426052],[471, 3, 1664078426211]]
}
let n = {}const f = {uhUaq: function (n, t) {return n - t},FuwxQ: function (n, t) {return n + t}
}let r = t.trajectory[0] ? t.trajectory[0][2] : 0let c = t.trajectory.slice(-100).reduce(function (n, t) {return f.FuwxQ(n,','.concat(t[0], '|').concat(t[1], '|').concat(f.uhUaq(t[2], r)))
}, '')console.log(c.slice(1))

本地结果和浏览器验证结果匹配,说明算法没有扣错

然后我们再回到之前的这个位置,目前已经把路径的参数给解决了,还剩下 captchaExtraParamcaptchaSngpuInfo

在这个位置下断点,当 case0 执行完之后,t 参数的 sent 会把最后的计算结果算出来并赋值


这里hook去跟一下


跟到这里的时候,Shift+F11

在此处下断点,重新刷新,进到f函数里面

进到这里之后,F8运行,观察 n 形参的变化

n变量的变化是这样的
1、先是UA和指纹信息

2、然后是会传一个超长的数组

3、最后就是运算出结果

当n出现数组的时候,F11进入,会进到这个位置,这里就是最后结果生成的地方

以下是每个值的参数和输出的结果

到了断点位置,
先执行完 u = e[i(“0x32”)],可以看到e的输出是一个大数组
然后执行e[i(“0x33”)](i(“0x34”), ni(“0x35”)i(“0x36”));
最后e里面的参数就计算出来了

所以我们只需要在这个地方注入我们需要的代码就可以,
然后将**c.a[i(“0x31”)],d,e[i(“0x33”)](i(“0x34”), ni(“0x35”)i(“0x36”))**导出到全局,然后rpc调用,或者你也可以扣代码,我这里是直接自己写一个WSS去调算法,想扣代码的大佬自己去扣,这里就不多废话了。

最后本地验证一下,成功获得凭证数据

补补补补补补补:

captchaSn参数是来自这个接口的返回数据

captchaSession参数又是来自上一个接口

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论