题九:webpack调试
该题使用了webpack技术打包并配有轻度OB混淆、适合模块化扣JavaScript代码练习
这个采用了基础的webpack调试
打开开发者模式开始调试,首先就是复制curl,然后到网站进行请求是什么加密
可以看到加密的'm': '1f284f2cc0aa0c4621d8cee0fb7fcd6a51661bd9', 'tt': 'MTc0NDQzNjIyNDU4Mg==',
然后就是hook一下m
var code = function(){
var open = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function (method, url, async){
if (url.indexOf("m")>-1){
debugger;
}
return open.apply(this, arguments);
};
}
var script = document.createElement('script');
script.textContent = '(' + code + ')()';
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
然后就会发现断住了,然后往上找
到这里就会发现,m的值实在这里生成的,很明显这里经过了混淆,发现这里没有显示m的生成位置,往上找,你就会发现
这里就有一个n.data.m = t.MqmaW(c, t[r(1881)](t[r(489)], f)),还有一个n[r(1939)].tt = btoa(f);,可以确定了,这里就是m还有tt的加密位置
这里用的是case,肯定是经过排序的,在上面找到排序的,把代码扣出来,
function main123() {
let time = (new Date)['getTime']().toString();
let m = c('9527' + time);
let tt = btoa(time);
return {
'f': time,
'm': m,
'tt': tt
}
}
console.log(main123());
这里面缺的就是这个c函数,打上断点,调试一下,就找到了这个 c函数
function c(n) {
var r = i
, t = {
RjdKj: function(n, r) {
return n % r
},
DBjOO: function(n, r) {
return n + r
},
BByPb: function(n, r) {
return n ^ r
},
KIZHi: function(n, r) {
return n | r
},
HAGBT: function(n, r) {
return n >>> r
},
pUtQl: function(n, r) {
return n < r
},
UwUnt: function(n, r) {
return n * r
},
WdUAe: function(n, r) {
return n + r
},
VDcvU: "debu",
PwEDm: r(2874),
KWaPS: r(1672),
BjniW: r(488),
ztPZi: function(n, r) {
return n === r
},
RaGFx: r(894),
bnqLR: r(2645)
};
if (n) {
if (t[r(2257)] !== t[r(697)])
return dd.aa[r(2897)](n, "xxxooo")[r(1049)]();
var u = _0x17006a[t[r(2743)](t[r(1811)](_0x219937, 4), 5)]
, e = _0x388b65[t[r(2743)](_0x416ac4 + 1, 5)]
, c = e[r(2756)]
, f = e[r(487)];
for (_0x1e7dc0 = t[r(2767)](u[r(2756)], t.KIZHi(c << 1, f >>> 31)),
_0x4d8156 = u[r(487)] ^ t.KIZHi(f << 1, t.HAGBT(c, 31)),
_0x680b88 = 0; t[r(2417)](_0x2a74ec, 5); _0xba8375++)
(_0x1c98da = _0x410975[t[r(1811)](_0x106157, t[r(1454)](5, _0x94eeb7))])[r(2756)] ^= _0x336535,
_0x26218e[r(487)] ^= _0x2ba16c
} else {
if (t.ztPZi(t[r(1938)], t.RaGFx))
return t[r(2406)];
(function() {
return !1
}
)[r(2726)](lnDKWR[r(1703)](lnDKWR[r(882)], "gger"))[r(2173)](lnDKWR[r(2933)])
}
}
然后就是把他解一下,这里就不解了,解完之后
function c(n) {
if (n) {
return dd.aa.HmacSHA1(n, "xxxooo").toString();
}
}
发现没有dd.aa,全局搜索一下
dd = {
aa: CryptoJS
}
然后就全部解完了
const CryptoJS = require('crypto-js');
function c(n) {
if (n) {
return CryptoJS.HmacSHA1(n, "xxxooo").toString();
}
}
function main123() {
let time = (new Date)['getTime']().toString();
let m = c('9527' + time);
let tt = btoa(time);
return {
'f': time,
'm': m,
'tt': tt
}
}
console.log(main123());