某手势验证码协议分析 二 (获取 还原)
地址:aHR0cHM6Ly93d3cudmFwdGNoYS5jb20v
文章只提供学习,如有侵权请立即联系我。
继上篇我们分析了config请求 并且获取到了 config 请求的响应 下面我们进行分析 get 请求 获取图片验证吗的请求
首先我们看一下 config 请求响应的响应体
我们看一下 get 请求的请求参数
我们 发现 k 是有 config 请求返回的 knock d 为我们第一篇 分析的 加密参数
重点则是 en ??????????????
en 到底是什么???
我们查看调用堆栈 然后进行拦截分析
我们发现此处已经生成了 我们向上分析
我们向上发现 在这个对应里面 有两个 方法 其中是 getImage 一个 是 verify
getImage 则是我们这次获取 图片的方法
我们进行debugger 分析
我们能看到 请求传入的参数 都是config 响应体 里面的 进行传入的 就不进行解释
GenerateFp 这个函数我们在上一章节已经进行介绍 此处就不再进行介绍 不明白的可以返回上一章节
_0x2dfb74[‘hb’] 这个为 conifg 里面的 hb
_0x2dfb74 这个函数我们可以进入看一下
ua 和 host 就不进行叙述了
那么我们继续看下一个
secretc 是在上面固定写的 通过搜索可以查询到
继续
_0x517b31[‘uaDelExtra’] 这个函数 我们进入查看发现这个函数我们可以直接 进行扣出
_0x17365e[‘hex_md5’] 这个函数是进行 md5
这个 globalMd5 是什么地方来的???
我们发现 globalMd5 是从这个地方进行 传入的 那么我们进行调用堆栈往上分析
在这个地方已经存在了 那么我们继续向上分析
我们通过搜索 发现有两个 地方进行 赋值 那么 我们进行 debugger 进行分析
(_0x4c7848['splicingObj']({
'cdn_servers': this['config']['cdn_servers'],
'css_version': this['config']['css_version'],
'guideVersion': this['config']['guideVersion'],
'hb': this['config']['hb'],
'help': this['config']['help'],
'ip': this['config']['ip'],
'is_vip': this['config']['is_vip'],
'js_path': this['config']['js_path'],
'knock': this['config']['knock'],
'net_way': this['config']['net_way'],
'node': this['config']['node'],
'origin_url': this['config']['origin_url'],
'sdk_ver': this['config']['sdk_ver'],
'u': this['config']['u'],
'ua': this['config']['ua']
})
_0x4c7848[‘splicingObj’] 这个函数 传入进入 的数据 正是第一步 config 获取的所有数据 就不进行叙述
通过_0x4c7848[‘splicingObj’] 这个把数据进行拼装
'statics-cn.vaptcha.net2.9.123.1.00dea7true120.244.142.161verify.2.0.19.js1639290144JD2bWl3a669-1CNhttps://www.vaptcha.com/vaptcha-sdk.1.0.96.6195c14a.js0'
然后进行 md5
就获取到 _0x2dfb74[‘globalMd5’]
_0x517b31['encryFunc'](_0x517b31['selectFrom'](0x3, 0xf), _0x92549c);
_0x517b31[‘selectFrom’] 这个函数 以及 _0x517b31[‘encryFunc’] 都能很容易找到
这次 我们分析 完毕
通过把所有代码进行 整合 我们 就可以拿到获取图片的代码
function _0x299ebc(_0x220365, _0x53dfe6) {
var _0x13ccef = '';
_0x13ccef = (parseInt(_0x220365) - _0x53dfe6)['toString']();
if (_0x13ccef['length'] < 0xa) {
_0x13ccef = '0' + _0x13ccef;
}
return _0x13ccef;
}
function _0x91a4aa(_0xd139c6) {
var _0x5a35f5 = _0xd139c6['length'], _0x328f74 = new Array(_0x5a35f5), _0x1ecf8b;
for (var _0x4e8ee8 = 0x0; _0x4e8ee8 < _0x5a35f5; _0x4e8ee8++) {
_0x1ecf8b = _0xd139c6['charCodeAt'](_0x4e8ee8);
if (0x30 <= _0x1ecf8b && _0x1ecf8b < 0x3a) {
_0x1ecf8b -= 0x30;
} else {
_0x1ecf8b = (_0x1ecf8b & 0xdf) - 0x41 + 0xa;
}
_0x328f74[_0x4e8ee8] = _0x1ecf8b;
}
var _0x43c8e3 = _0x328f74['reduce'](function (_0x74d7f4, _0x27841f) {
_0x74d7f4 = 0x10 * _0x74d7f4 + _0x27841f;
return _0x74d7f4;
}, 0x0);
return _0x43c8e3;
}
function _0x2dc288(_0x4eab36, _0x4449ef) {
var _0x119692;
var _0x237b64 = '';
var _0x112f7 = '0123456789abcdefghijklmnopqrstuvwxyz';
var _0x38266c = '8';
var _0x2bba31 = _0x50d390(_0x4eab36 * 0x2, 0x0, 0x23);
for (var _0x269f48 = 0x0; _0x269f48 < _0x2bba31['length']; _0x269f48++) {
_0x237b64 += _0x112f7['charAt'](_0x2bba31[_0x269f48]);
}
for (var _0x269f48 = 0x0; _0x269f48 < _0x4eab36; _0x269f48++) {
_0x4449ef = _0x1b0d46(_0x4449ef, _0x237b64['charAt'](_0x269f48 * 0x2), _0x237b64['charAt'](_0x269f48 * 0x2 + 0x1));
}
_0x119692 = _0x4eab36['toString'](0x10) + parseInt(_0x38266c) + _0x237b64 + _0x2dacb9(_0x4449ef);
return _0x119692;
}
function _0x2dacb9(_0x58784e) {
return _0x1b0d46(_0x58784e, 'e', '9');
}
function _0x5e1ee8(_0x2637ad, _0x35468a) {
var _0x5ecf28 = _0x35468a - _0x2637ad + 0x1;
return Math['floor'](Math['random']() * _0x5ecf28 + _0x2637ad);
}
function _0x50d390(_0xf6d341, _0x52ceaa, _0x5c0b03) {
var _0x31e068 = [];
for (var _0x1e5aae = 0x0; _0x1e5aae < _0xf6d341; _0x1e5aae++) {
_0x31e068[_0x1e5aae] = _0x5e1ee8(_0x52ceaa, _0x5c0b03);
for (var _0x43fa48 = 0x0; _0x43fa48 < _0x1e5aae; _0x43fa48++) {
if (_0x31e068[_0x1e5aae] == _0x31e068[_0x43fa48]) {
_0x1e5aae--;
break;
}
}
}
return _0x31e068;
}
function _0x1b0d46(_0x563a68, _0x353d0d, _0x2f92bb) {
_0x563a68 = _0x563a68['replace'](new RegExp(_0x353d0d, 'g'), '+');
_0x563a68 = _0x563a68['replace'](new RegExp(_0x2f92bb, 'g'), _0x353d0d);
_0x563a68 = _0x563a68['replace'](/\+/g, _0x2f92bb);
return _0x563a68;
}
function _0x405f04(_0x49a762) {
if (_0x49a762['indexOf']('\x20webCore') > -0x1)
return _0x49a762['substr'](0x0, _0x49a762['indexOf'](