概要
提示:仅供学习,不得用做商业交易,如有侵权请及时联系!
逆向:xx志愿服务网
URL:aHR0cDovL2NoaW5hdm9sdW50ZWVyLm1jYS5nb3YuY24vc2l0ZS9wcm9qZWN0
目标:表单数据中的 encData参数
整体架构流程
提示:分析-调试-猜想-实现-执行
1、直接开始全局搜索encData:
我们用鼠标去触发第二页:
我们打印这几个参数和方法,看看都是些什么:
上图我们发现有几个关键参数:key,iv,mode,encrypt,信息做多了js逆向人都知道,这肯定是一个aes或者des加密,我们猜测一下,来验证是不是标准加密:
发现与上图的结果不一致,那么肯定是魔改了!
2、这个时候我们只能进入S方法,看看里面都进行了什么操作,然后返回了对象从而调用encrypt方法的:
往上找,我们看看这个w方法在哪里:
我们发现w是一个自执行函数,上面n(“EKta”)有点像webpack来调用的:
3、w方法是在webpack里面加载对象的独立空间,那么我们可以将该对象里面的所有方法和变量都可以扣下来,然后缺什么补什么:
发现A没有定义,那么我们可以重新断点进入,看看里面是什么:
我们去断点发现断不住,那么我们直接进入方法里面去断点:
这里我们发现a方法其实是一个:Object.defineProperty,直接将a()改成这个!
继续补g方法:
我们可以看到其实g什么都没有做,就是赋了俩个值:
继续补b方法:
我们仔细看这个p会方法该方法其实就是刚刚的A方法:
key: "stringToArrayBufferInUtf8",
value: function(e) {
var t = TextEncoder;
return (new t).encode(e)
}
打印继续看看缺啥:
继续补u对象,断点跳转进去扣下来:
var u = {
encode: function(t) {
return t.replace(/./g, function(t) {
var n = t.charCodeAt(0);
if (8364 == (r = n) || r <= 127 && r >= 0)
return encodeURIComponent(t);
var r, i = n.toString(16);
return 4 != i.length && (i = ("000" + i).match(/....$/)[0]),
e[i] || t
})
},
decode: function(e) {
return e.replace(/%[0-9A-F]{2}%[0-9A-F]{2}/g, function(e) {
return e in t ? String.fromCharCode("0x" + t[e]) : e
}).replace(/%[\w]{2}/g, function(e) {
return decodeURIComponent(e)
})
}
}
发现缺少h对象,继续扣,断点跳转进去发现就是这三个方法:
var h = {
byteLength : function(e) {
var t = f(e)
, n = t[0]
, r = t[1];
return 3 * (n + r) / 4 - r
},
toByteArray : function(e) {
var t, n, r = f(e), a = r[0], c = r[1], s = new o(function(e, t, n) {
return 3 * (t + n) / 4 - n
}(0, a, c)), l = 0, u = c > 0 ? a - 4 : a;
for (n = 0; n < u; n += 4)
t = i[e.charCodeAt(n)] << 18 | i[e.charCodeAt(n + 1)] << 12 | i[e.charCodeAt(n + 2)] << 6 | i[e.charCodeAt(n + 3)],
s[l++] = t >> 16 & 255,
s[l++] = t >> 8 & 255,
s[l++] = 255 & t;
2 === c && (t = i[e.charCodeAt(n)] << 2 | i[e.charCodeAt(n + 1)] >> 4,
s[l++] = 255 & t);
1 === c && (t = i[e.charCodeAt(n)] << 10 | i[e.charCodeAt(n + 1)] << 4 | i[e.charCodeAt(n + 2)] >> 2,
s[l++] = t >> 8 & 255,
s[l++] = 255 & t);
return s
},
fromByteArray : function(e) {
for (var t, n = e.length, i = n % 3, o = [], a = 0, c = n - i; a < c; a += 16383)
o.push(l(e, a, a + 16383 > c ? c : a + 16383));
1 === i ? (t = e[n - 1],
o.push(r[t >> 2] + r[t << 4 & 63] + "==")) : 2 === i && (t = (e[n - 2] << 8) + e[n - 1],
o.push(r[t >> 10] + r[t >> 4 & 63] + r[t << 2 & 63] + "="));
return o.join("")
}
}
继续断点补l方法:
function l(e, t, n) {
for (var i, o, a = [], c = t; c < n; c += 3)
i = (e[c] << 16 & 16711680) + (e[c + 1] << 8 & 65280) + (255 & e[c + 2]),
a.push(r[(o = i) >> 18 & 63] + r[o >> 12 & 63] + r[o >> 6 & 63] + r[63 & o]);
return a.join("")
}
发现缺少r对象:
断点发现r为一个数组值:
最后运行发现:
4、还有一种就是webpack的形式:
留着自己扣吧!
技术细节
提示:边更边扣,跟对地方
小结
提示:学习交流群:v:wzwzwz0613拉进群