【原创】 猿人学第一题解析
本文适合像我一样得小白,大牛请略过,主要是记录,哈哈哈。一、 发现一个练手的好地方昨日在浏览论坛的时候,发现大牛 发了一个帖子 猿人学第二题 手把手补环境
链接地址:猿人学第2题手把手补环境 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
依照Anekys 大牛提供的地址,进入之后返现者的是个练手的好地方,哈哈哈,js解密过程中,能遇到的问题,几乎在这边全部遇到了。并且还有解题排名,膜拜各种大牛的机会。
二、 正式开始
2.1 过掉debugger 分析页面
首先看第一题
要求是获取机票的平均价格,填入答案。
依照国际管理,F12,开发者工具,ctrl+shift+r 重新加载页面,不出意外的界面停止在debugger
直接在第二行除邮件编辑断点值填写false,过掉debugger。
2.2依次点击每一页的值查看,请求值变化
第一页/api/match/1?m=5c70fb1948228fdf84f74568b037fa11|81671008953
第二页 /api/match/1?page=2&m=922c0993d9df7bc038a09470c17d5901|81671009628
第三页 api/match/1?page=3&m=e9526008c0fde5ba4e4499ec78289239|81671032379
不难看出请求不能的页面出了添加了page的参数外,m的值发生了变化,如果在全局搜索里面搜索m的话,这个值太多了直接去启动器中查看堆栈调用
排除掉ajax 后,第一个就是request函数了,点击函数进入源代码区查看。
2.3 解密混淆和加密得js代码
js代码被加密混淆了,在线搜索js解密工具,其实不解密也能看,但是阅读的难度就比较高了。
解码后得到
window['url'] = '/api/' + 'match' + '/1',
request = function() {
var _0x2268f9 = Date['parse'](new Date()) + (16798545 + -72936737 + 156138192),
_0x57feae = oo0O0(_0x2268f9['toStr' + 'ing']()) + window['f'];
const _0x5d83a3 = {};
_0x5d83a3['page'] = window['page'],
_0x5d83a3['m'] = _0x57feae + '丨' + _0x2268f9 / (-1 * 3483 + -9059 + 13542); //看到m出现了
var _0xb89747 = _0x5d83a3;
$['ajax']({
'url': window['url'],
'dataType': 'json',
'async': ![],
'data': _0xb89747,
'type': 'GET',
'beforeSend': function(_0x4c488e) {},
'success': function(_0x131e59) {
_0x131e59 = _0x131e59['data'];
let _0x354583 = '',
_0x1b89ba = '<div ' + 'class' + '="b-a' + 'irfly' + '"><di' + 'v cla' + 'ss="e' + '-airf' + 'ly"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0"><' + 'div c' + 'lass=' + '"col-' + 'trip"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0"><d' + 'iv cl' + 'ass="' + 's-tri' + 'p"dat' + 'a-rea' + 'ctid=' + '".1.3' + '.3.2.' + '0.$KN' + '5911.' + '0.0.0' + '"><di' + 'v cla' + 'ss="c' + 'ol-ai' + 'rline' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '0"><d' + 'iv cl' + 'ass="' + 'd-air' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '0.0:$' + '0"><d' + 'iv cl' + 'ass="' + 'air"d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.0' + '.0.0.' + '0:$0.' + '0"><s' + 'pan d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.0' + '.0.0.' + '0:$0.' + '0.1">' + '中国联合航' + '空</sp' + 'an></' + 'div><' + 'div c' + 'lass=' + '"num"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0.0.0' + '.0:$0' + '.1"><' + 'span ' + 'class' + '="n"d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.0' + '.0.0.' + '0:$0.' + '1.0">' + 'KN591' + '1</sp' + 'an><s' + 'pan c' + 'lass=' + '"n"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.0.' + '0.0.0' + ':$0.1' + '.1">波' + '音737(' + '中)</s' + 'pan><' + 'noscr' + 'ipt d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.0' + '.0.0.' + '0:$0.' + '1.2">' + '</nos' + 'cript' + '></di' + 'v></d' + 'iv><n' + 'oscri' + 'pt da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.0.' + '0.0.1' + '"></n' + 'oscri' + 'pt></' + 'div><' + 'div c' + 'lass=' + '"col-' + 'time"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0.0.1' + '"><di' + 'v cla' + 'ss="s' + 'ep-lf' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '1.0">' + '<h2 d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + ('2.0.$' + 'KN591' + '1.0.0' + '.0.1.' + '0.0">' + '13:50' + '</h2>' + '<p cl' + 'ass="' + 'airpo' + 'rt"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.0.' + '0.1.0' + '.1"><' + 'span ' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0.0.1' + '.0.1.' + '0">大兴' + '国际机场<' + '/span' + '><spa' + 'n dat' + 'a-rea' + 'ctid=' + '".1.3' + '.3.2.' + '0.$KN' + '5911.' + '0.0.0' + '.1.0.' + '1.1">' + '</spa' + 'n></p' + '></di' + 'v><di' + 'v cla' + 'ss="s' + 'ep-ct' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '1.1">' + '<div ' + 'class' + '="ran' + 'ge"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.0.' + '0.1.1' + '.0">3' + '小时40分' + '钟</di' + 'v><di' + 'v cla' + 'ss="l' + 'ine"d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.0' + '.0.1.' + '1.1">' + '</div' + '></di' + 'v><di' + 'v cla' + 'ss="s' + 'ep-rt' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '1.2">' + '<nosc' + 'ript ' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0.0.1' + '.2.0"' + '></no' + 'scrip' + 't><h2' + ' data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '1.2.1' + '">17:' + '30</h' + '2><p ' + 'class' + '="air' + 'port"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '0.0.1' + '.2.2"' + '><spa' + 'n dat' + 'a-rea' + 'ctid=' + '".1.3' + '.3.2.' + '0.$KN' + '5911.' + '0.0.0' + '.1.2.' + '2.0">' + '宝安机场<' + '/span' + '></p>' + '</div' + '><nos' + 'cript' + ' data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.0.0.' + '1.3">' + '</nos' + 'cript' + '></di' + 'v></d' + 'iv></' + 'div><' + 'div c' + 'lass=' + '"col-' + 'price' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.1"><' + 'p cla' + 'ss="p' + 'rc"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.1.' + '0"><s' + 'pan d' + 'ata-r' + 'eacti' + 'd=".1') + ('.3.3.' + '2.0.$' + 'KN591' + '1.0.1' + '.0.0"' + '><i c' + 'lass=' + '"rmb"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '1.0.0' + '.0">&' + 'yen;<' + '/i><s' + 'pan c' + 'lass=' + '"fix_' + 'price' + '"data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.0' + '.1.0.' + '0.1">' + '<span' + ' clas' + 's="pr' + 'c_wp"' + 'style' + '="wid' + 'th:48' + 'px">p' + 'rice_' + 'sole<' + '/span' + '></sp' + 'an></' + 'span>' + '</p><' + 'div c' + 'lass=' + '"vim"' + 'data-' + 'react' + 'id=".' + '1.3.3' + '.2.0.' + '$KN59' + '11.0.' + '1.1">' + '<span' + ' clas' + 's="v ' + 'dis"d' + 'ata-r' + 'eacti' + 'd=".1' + '.3.3.' + '2.0.$' + 'KN591' + '1.0.1' + '.1.$0' + '"></s' + 'pan><' + '/div>' + '</div' + '><div' + ' clas' + 's="co' + 'l-fol' + 'd"dat' + 'a-rea' + 'ctid=' + '".1.3' + '.3.2.' + '0.$KN' + '5911.' + '0.2">' + '<p cl' + 'ass="' + 'fd"da' + 'ta-re' + 'actid' + '=".1.' + '3.3.2' + '.0.$K' + 'N5911' + '.0.2.' + '0">收起' + '</p><' + '/div>' + '</div' + '><nos' + 'cript' + ' data' + '-reac' + 'tid="' + '.1.3.' + '3.2.0' + '.$KN5' + '911.1' + '"></n' + 'oscri' + 'pt></' + 'div>'),
_0x548377 = ['中国南方航' + '空', '吉祥航空', '奥凯航空', '九元航空', '长龙航空', '东方航空', '中国国际航' + '空', '深圳航空', '海南航空', '春秋航空', '上海航空', '西部航空', '重庆航空', '西藏航空', '中国联合航' + '空', '云南祥鹏航' + '空', '云南英安航' + '空', '厦门航空', '天津航空', '山东航空', '四川航空', '华夏航空', '长城航空', '成都航空有', '北京首都航' + '空', '中华航空', '意大利国家' + '航空公司', '印度百捷航' + '空', '越南航空', '远东航空', '印度航空公' + '司', '印度捷特航' + '空有限公司', '以色列航空' + '公司', '意大利航空', '伊朗航空公' + '司', '印度尼西亚' + '鹰航空公司', '英国航空公' + '司', '西方天空航' + '空', '西捷航空', '西班牙欧洲' + '航空公司', '西班牙航空' + '公司', '中国南方航' + '空', '吉祥航空', '奥凯航空', '九元航空', '长龙航空', '东方航空', '中国国际航' + '空', '深圳航空', '海南航空', '春秋航空', '上海航空', '西部航空', '重庆航空', '西藏航空', '中国联合航' + '空', '云南祥鹏航' + '空', '云南英安航' + '空', '厦门航空', '天津航空', '山东航空', '四川航空', '华夏航空', '长城航空', '成都航空有', '北京首都航' + '空', '中华航空', '意大利国家' + '航空公司', '印度百捷航' + '空', '越南航空', '远东航空', '印度航空公' + '司', '印度捷特航' + '空有限公司', '以色列航空' + '公司', '意大利航空', '伊朗航空公' + '司', '印度尼西亚' + '鹰航空公司', '英国航空公' + '司', '西方天空航' + '空', '西捷航空', '西班牙欧洲' + '航空公司', '西班牙航空' + '公司'],
_0x5286d2 = 22 * 251 + -1721 + -3800,
_0xa24ff9 = ['北京首都国' + '际机场', '上海虹桥国' + '际机场', '上海浦东国' + '际机场', '天津滨海国' + '际机场', '太原武宿机' + '场', '呼和浩特白' + '塔机场', '沈阳桃仙国' + '际机场', '大连周水子' + '国际机场', '长春大房身' + '机场', '哈尔滨阎家' + '岗国际机场', '齐齐哈尔三' + '家子机场', '佳木斯东郊' + '机场', '厦门高崎国' + '际机场', '福州长乐国' + '际机场', '杭州萧山国' + '际机场', '合肥骆岗机' + '场', '宁波栎社机' + '场', '南京禄口国' + '际机场', '广州白云国' + '际机场', '深圳宝安国' + '际机场', '长沙黄花机' + '场', '海口美亚机' + '场', '武汉天河机' + '场', '济南遥墙机' + '场', '青岛流亭机' + '场', '南宁吴墟机' + '场', '三亚凤凰国' + '际机场', '重庆江北国' + '际机场', '成都双流国' + '际机场', '昆明巫家坝' + '国际机场', '昆明长水国' + '际机场', '桂林两江国' + '际机场', '西安咸阳国' + '际机场', '兰州中川机' + '场', '贵阳龙洞堡' + '机场', '拉萨贡嘎机' + '场', '乌鲁木齐地' + '窝堡机场', '南昌向塘机' + '场', '郑州新郑机' + '场', '北京首都国' + '际机场', '上海虹桥国' + '际机场', '上海浦东国' + '际机场', '天津滨海国' + '际机场', '太原武宿机' + '场', '呼和浩特白' + '塔机场', '沈阳桃仙国' + '际机场', '大连周水子' + '国际机场', '长春大房身' + '机场', '哈尔滨阎家' + '岗国际机场', '齐齐哈尔三' + '家子机场', '佳木斯东郊' + '机场', '厦门高崎国' + '际机场', '福州长乐国' + '际机场', '杭州萧山国' + '际机场', '合肥骆岗机' + '场', '宁波栎社机' + '场', '南京禄口国' + '际机场', '广州白云国' + '际机场', '深圳宝安国' + '际机场', '长沙黄花机' + '场', '海口美亚机' + '场', '武汉天河机' + '场', '济南遥墙机' + '场', '青岛流亭机' + '场', '南宁吴墟机' + '场', '三亚凤凰国' + '际机场', '重庆江北国' + '际机场', '成都双流国' + '际机场', '昆明巫家坝' + '国际机场', '昆明长水国' + '际机场', '桂林两江国' + '际机场', '西安咸阳国' + '际机场', '兰州中川机' + '场', '贵阳龙洞堡' + '机场', '拉萨贡嘎机' + '场', '乌鲁木齐地' + '窝堡机场', '南昌向塘机' + '场', '郑州新郑机' + '场'];
if (window['page']) {} else
window['page'] = 2333 * 3 + 458 * -5 + -4708;
$['each'](_0x131e59, function(_0x282f1d, _0x4e0853) {
_0x354583 += _0x1b89ba['repla' + 'ce']('price' + '_sole', _0x4e0853['value'])['repla' + 'ce']('中国联合航' + '空', _0x548377])['repla' + 'ce']('大兴国际', _0xa24ff9 / (659 + 785 * -7 + 4838)) + (5666 * 1 + 2 * -4161 + 2657)])['repla' + 'ce']('宝安机场', _0xa24ff9 - parseInt(_0x5286d2 * window['page'] / (8357 + -323 * 1 + -8032)) - (350 + -9 * 295 + 2306)]),
_0x5286d2 += -156 * -53 + -78 * -111 + -16925;
}),
$('.m-ai' + 'rfly-' + 'lst')['text']('')['appen' + 'd'](_0x354583);
},
'complete': function() {},
'error': function() {
alert('数据拉取失' + '败。可能是' + '触发了风控' + '系统,若您' + '是正常访问' + ',请使用谷' + '歌浏览器无' + '痕模式,并' + '且校准电脑' + '的系统时间' + '重新尝试'),
alert('生而为虫,' + '我很抱歉,' + '请刷新页面' + ',查看问题' + '是否存在'),
$('.page' + '-mess' + 'age')['eq'](17 * -94 + 1014 + -4 * -146)['addCl' + 'ass']('activ' + 'e'),
$('.page' + '-mess' + 'age')['remov' + 'eClas' + 's']('activ' + 'e');
}
});
},
request();
虽然还是有加密的内容,但是我们看到了需要的关键数据 page 和 m的出现并且后面又是ajax,推断加密代码就在前面几行,对照加密数据设置断点。
果然断在了断点处,步进查看变化。
小技巧:如果数值看不懂得,可以直接在控制台输入之后;
继续往下走,跳转到了第一页 页面自身得 javascript,因为页面是一行超级长,复制出来,格式化以便理解。
继续安利,哈哈哈,我举得我更像一个分享up主。
删除掉不要得之后,发现了管家加密函数--------- oo0O0是的就是这个狗东西。
请注意后面那个孤零零得箭头,就是她使我走向了一条没有尽头得路。
三、 解密关键函数
上文说到,window['\x66']\x66 就是f啦,解密后的函数有表明,在跟进 关键解密函数 oo0O0后,函数内容如下:
function oo0O0(mw) {
window.b = '';
for (var i = 0, len = window.a.length; i < len; i++) {
console.log(window.a);
window.b += String(window.a() - i - window.c)
}
var U = ['W5r5W6VdIHZcT8kU', 'WQ8CWRaxWQirAW=='];
var J = function (o, E) {
o = o - 0x0;
var N = U;
if (J['bSSGte'] === undefined) {
var Y = function (w) {
var m = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=',
T = String(w)['replace'](/=+$/, '');
var A = '';
for (var C = 0x0, b, W, l = 0x0; W = T['charAt'](l++); ~W && (b = C % 0x4 ? b * 0x40 + W : W, C++ % 0x4) ? A += String['fromCharCode'](0xff & b >> (-0x2 * C & 0x6)) : 0x0) {
W = m['indexOf'](W)
}
return A
};
var t = function (w, m) {
var T = [],
A = 0x0,
C,
b = '',
W = '';
w = Y(w);
for (var R = 0x0, v = w['length']; R < v; R++) {
W += '%' + ('00' + w['charCodeAt'](R)['toString'](0x10))['slice'](-0x2)
}
w = decodeURIComponent(W);
var l;
for (l = 0x0; l < 0x100; l++) {
T = l
}
for (l = 0x0; l < 0x100; l++) {
A = (A + T + m['charCodeAt'](l % m['length'])) % 0x100,
C = T,
T = T,
T = C
}
l = 0x0,
A = 0x0;
for (var L = 0x0; L < w['length']; L++) {
l = (l + 0x1) % 0x100,
A = (A + T) % 0x100,
C = T,
T = T,
T = C,
b += String['fromCharCode'](w['charCodeAt'](L) ^ T[(T + T) % 0x100])
}
return b
};
J['luAabU'] = t,
J['qlVPZg'] = {},
J['bSSGte'] = !![]
}
var H = J['qlVPZg'];
return H === undefined ? (J['TUDBIJ'] === undefined && (J['TUDBIJ'] = !![]), N = J['luAabU'](N, E), J['qlVPZg'] = N) : N = H,
N
};
eval(atob(window['b'])dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));
return ''
}
看到函数定义后马上定义了一个,window.b , window.b得值 是通过windows.a.length(长度)for 循环后计算得出,那么window.a的值是从哪里得来得呢,全局搜索后 window.a ,发现在自身页面得js中有定义。
嘿嘿,正道得光………………
第一个就在第一行,但是这一行也是超级长得,浏览器自带得格式化不管用,怎么操作不用我说了吧,嘿嘿,刚安利得工具。
看到了windows.a但是貌似是乱码,控制台一下,window.a
也是存在各种各样得符号,监控一次此时得windows.b,
值越来越多了,哈哈哈,正道得光又要来了……
不仅仅在第一页找到了,window.a 连window.c 等等参与运算的,全部都找到了。
感觉自己离真相越来越近了。
在关键函数的下一行下断点,放开跑到断点之前,我们需要的m的值已经找到了。
此时我们也已经获得了window.b的全部值。
在我们解密后的关键函数中,看到window.b 有个atob ,百度一下
[*]atob() //ASCII to Base64
[*]btoa() //Base64 to ASCII
atob() 函数能够解码通过base-64编码的字符串数据。相反地,btoa() 函数能够从二进制数据“字符串”创建一个base-64编码的ASCII字符串。
反正不懂就找百度,控制到运行 atob(windows['b'])
得到了另外一串js代码,观察发现貌似是md5加密的,放进wt里面跑一下(WT是个js调试工具,貌似也是吾爱大神弄出来的,在这里致敬一下,我等匹夫只能用下别人的工具了,做个工具小子吧)。
还记得那个孤独的箭头吗 ,对的,window['f']哪里。
至此我们终于找到了,真正的加密代码。
var hexcase = 0;
var b64pad = "";
var chrsz = 16;
function hex_md5(a) {
return binl2hex(core_md5(str2binl(a), a.length * chrsz))
}
function b64_md5(a) {
return binl2b64(core_md5(str2binl(a), a.length * chrsz))
}
function str_md5(a) {
return binl2str(core_md5(str2binl(a), a.length * chrsz))
}
function hex_hmac_md5(a, b) {
return binl2hex(core_hmac_md5(a, b))
}
function b64_hmac_md5(a, b) {
return binl2b64(core_hmac_md5(a, b))
}
function str_hmac_md5(a, b) {
return binl2str(core_hmac_md5(a, b))
}
function md5_vm_test() {
return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"
}
function core_md5(p, k) {
p |= 128 << ((k) % 32);
p[(((k + 64) >>> 9) << 4) + 14] = k;
var o = 1732584193;
var n = -271733879;
var m = -1732584194;
var l = 271733878;
for (var g = 0; g < p.length; g += 16) {
var j = o;
var h = n;
var f = m;
var e = l;
o = md5_ff(o, n, m, l, p, 7, -680976936);
l = md5_ff(l, o, n, m, p, 12, -389564586);
m = md5_ff(m, l, o, n, p, 17, 606105819);
n = md5_ff(n, m, l, o, p, 22, -1044525330);
o = md5_ff(o, n, m, l, p, 7, -176418897);
l = md5_ff(l, o, n, m, p, 12, 1200080426);
m = md5_ff(m, l, o, n, p, 17, -1473231341);
n = md5_ff(n, m, l, o, p, 22, -45705983);
o = md5_ff(o, n, m, l, p, 7, 1770035416);
l = md5_ff(l, o, n, m, p, 12, -1958414417);
m = md5_ff(m, l, o, n, p, 17, -42063);
n = md5_ff(n, m, l, o, p, 22, -1990404162);
o = md5_ff(o, n, m, l, p, 7, 1804660682);
l = md5_ff(l, o, n, m, p, 12, -40341101);
m = md5_ff(m, l, o, n, p, 17, -1502002290);
n = md5_ff(n, m, l, o, p, 22, 1236535329);
o = md5_gg(o, n, m, l, p, 5, -165796510);
l = md5_gg(l, o, n, m, p, 9, -1069501632);
m = md5_gg(m, l, o, n, p, 14, 643717713);
n = md5_gg(n, m, l, o, p, 20, -373897302);
o = md5_gg(o, n, m, l, p, 5, -701558691);
l = md5_gg(l, o, n, m, p, 9, 38016083);
m = md5_gg(m, l, o, n, p, 14, -660478335);
n = md5_gg(n, m, l, o, p, 20, -405537848);
o = md5_gg(o, n, m, l, p, 5, 568446438);
l = md5_gg(l, o, n, m, p, 9, -1019803690);
m = md5_gg(m, l, o, n, p, 14, -187363961);
n = md5_gg(n, m, l, o, p, 20, 1163531501);
o = md5_gg(o, n, m, l, p, 5, -1444681467);
l = md5_gg(l, o, n, m, p, 9, -51403784);
m = md5_gg(m, l, o, n, p, 14, 1735328473);
n = md5_gg(n, m, l, o, p, 20, -1921207734);
o = md5_hh(o, n, m, l, p, 4, -378558);
l = md5_hh(l, o, n, m, p, 11, -2022574463);
m = md5_hh(m, l, o, n, p, 16, 1839030562);
n = md5_hh(n, m, l, o, p, 23, -35309556);
o = md5_hh(o, n, m, l, p, 4, -1530992060);
l = md5_hh(l, o, n, m, p, 11, 1272893353);
m = md5_hh(m, l, o, n, p, 16, -155497632);
n = md5_hh(n, m, l, o, p, 23, -1094730640);
o = md5_hh(o, n, m, l, p, 4, 681279174);
l = md5_hh(l, o, n, m, p, 11, -358537222);
m = md5_hh(m, l, o, n, p, 16, -722881979);
n = md5_hh(n, m, l, o, p, 23, 76029189);
o = md5_hh(o, n, m, l, p, 4, -640364487);
l = md5_hh(l, o, n, m, p, 11, -421815835);
m = md5_hh(m, l, o, n, p, 16, 530742520);
n = md5_hh(n, m, l, o, p, 23, -995338651);
o = md5_ii(o, n, m, l, p, 6, -198630844);
l = md5_ii(l, o, n, m, p, 10, 11261161415);
m = md5_ii(m, l, o, n, p, 15, -1416354905);
n = md5_ii(n, m, l, o, p, 21, -57434055);
o = md5_ii(o, n, m, l, p, 6, 1700485571);
l = md5_ii(l, o, n, m, p, 10, -1894446606);
m = md5_ii(m, l, o, n, p, 15, -1051523);
n = md5_ii(n, m, l, o, p, 21, -2054922799);
o = md5_ii(o, n, m, l, p, 6, 1873313359);
l = md5_ii(l, o, n, m, p, 10, -30611744);
m = md5_ii(m, l, o, n, p, 15, -1560198380);
n = md5_ii(n, m, l, o, p, 21, 1309151649);
o = md5_ii(o, n, m, l, p, 6, -145523070);
l = md5_ii(l, o, n, m, p, 10, -1120210379);
m = md5_ii(m, l, o, n, p, 15, 718787259);
n = md5_ii(n, m, l, o, p, 21, -343485551);
o = safe_add(o, j);
n = safe_add(n, h);
m = safe_add(m, f);
l = safe_add(l, e)
}
return Array(o, n, m, l)
}
function md5_cmn(h, e, d, c, g, f) {
return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)
}
function md5_ff(g, f, k, j, e, i, h) {
return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h)
}
function md5_gg(g, f, k, j, e, i, h) {
return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h)
}
function md5_hh(g, f, k, j, e, i, h) {
return md5_cmn(f ^ k ^ j, g, f, e, i, h)
}
function md5_ii(g, f, k, j, e, i, h) {
return md5_cmn(k ^ (f | (~j)), g, f, e, i, h)
}
function core_hmac_md5(c, f) {
var e = str2binl(c);
if (e.length > 16) {
e = core_md5(e, c.length * chrsz)
}
var a = Array(16),
d = Array(16);
for (var b = 0; b < 16; b++) {
a = e ^ 909522486;
d = e ^ 1549556828
}
var g = core_md5(a.concat(str2binl(f)), 512 + f.length * chrsz);
return core_md5(d.concat(g), 512 + 128)
}
function safe_add(a, d) {
var c = (a & 65535) + (d & 65535);
var b = (a >> 16) + (d >> 16) + (c >> 16);
return (b << 16) | (c & 65535)
}
function bit_rol(a, b) {
return (a << b) | (a >>> (32 - b))
}
function str2binl(d) {
var c = Array();
var a = (1 << chrsz) - 1;
for (var b = 0; b < d.length * chrsz; b += chrsz) {
c |= (d.charCodeAt(b / chrsz) & a) << (b % 32)
}
return c
}
function binl2str(c) {
var d = "";
var a = (1 << chrsz) - 1;
for (var b = 0; b < c.length * 32; b += chrsz) {
d += String.fromCharCode((c >>> (b % 32)) & a)
}
return d
}
function binl2hex(c) {
var b = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var d = "";
for (var a = 0; a < c.length * 4; a++) {
d += b.charAt((c >> ((a % 4) * 8 + 4)) & 15) + b.charAt((c >> ((a % 4) * 8)) & 15)
}
return d
}
function binl2b64(d) {
var c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var f = "";
for (var b = 0; b < d.length * 4; b += 3) {
var e = (((d >> 8 * (b % 4)) & 255) << 16) | (((d >> 8 * ((b + 1) % 4)) & 255) << 8) | ((d >> 8 * ((b + 2) % 4)) & 255);
for (var a = 0; a < 4; a++) {
if (b * 8 + a * 6 > d.length * 32) {
f += b64pad
} else {
f += c.charAt((e >> 6 * (3 - a)) & 63)
}
}
}
return f
};
验证一下是否正确
哦吼,是一致的,那么说明,我们找的的加密函数是正确的,挖哈哈哈哈哈!!
四、关于算法
算法也是挺简单的,
1.首先生成一个时间戳
2.用hex_md5()函数加密时间戳,
3.用时间戳除以1000 得到后面的值,
别问我为什么指导的,下一句就是,哈哈哈。
具体的就不写了哈,后续有时间在写python的实现。发现写文章还挺浪费时间,但是还是想把这些分享出来,给像我一样的小白避坑!!!
看床走不动路 发表于 2022-12-17 15:00
感谢分享!
直接在这一步“直接在第二行除邮件编辑断点值填写false,过掉debugger”卡住不动如山{:301_1 ...
我刚才特地测试了一下,不会卡啊,你看下你的浏览器,最好ctrl+shift+N,创建一个无痕模式的浏览器,这样浏览器不加载其他插件,可能就不会卡了。 本帖最后由 看床走不动路 于 2022-12-18 17:00 编辑
cainfish 发表于 2022-12-18 15:23
我刚才特地测试了一下,不会卡啊,你看下你的浏览器,最好ctrl+shift+N,创建一个无痕模式的浏览器,这样 ...
是我当时思路卡住了 【抱歉】{:301_971:}我用的edge无痕,右键断点没有编辑选项(如下图)
后来点击“永不在此处暂停”搞定了,感谢分享 感谢楼主分享
厉害,厉害,真棒~我就是学不会 其实这里有个误区,那个关键解密函数return 的是个空值,真正有用的是atob(window.b),并且window。b 页面加载完之后,就能atob了
感谢分享 是不是大神太多了,没人看。嘎嘎,看来要练习技术了,写点牛逼的! 谢谢楼主分享 牛逼,看得头大,哈哈 感谢分享!
直接在这一步“直接在第二行除邮件编辑断点值填写false,过掉debugger”卡住不动如山{:301_1005:} 感谢大家的评论,最近在学习JavaScript,到时后更新更多的文章给大家。
页:
[1]
2