一、逆向目标

image.png

二、逆向参数

1、定位加密位置

打XHR断点,向上跟栈,找到pin密码字段加密处:

image.png

也可以全局搜索关键字 “pin” 定位到函数所在的位置

image.png

2、逆向加密函数encryptedString

pin: i.default.encryptedString(t)
encryptedString: function(e) {
try {
var t = e;
(new Date).getTime();
return t = window.isNative ? _.default.encryptedString(e) : m.default.encryptedString(e),
(new Date).getTime(),
t
} catch (t) {
return e
}
}

向上翻,可以明显看到是webpack!!!

image.png

3、webpack扣取代码

1)找到webpack启动器

首先,可以看到最终的加密代码为:

return t = window.isNative ? _.default.encryptedString(e) : m.default.encryptedString(e),

这块是一个三目表达式,可以就看到真正加密函数为:

m.default.encryptedString(e)

image.png

这块的对象是 “m” ,向上查找,成功定位到定义 “m” 的位置:

m = E(n(87377))

image.png

刚好掉下是定义了函数 E 的位置,所以,这块的加载器,肯定还是 n,所以在这块打断点,刷新页面:

image.png

断点,断下后,找到了启动器的位置:

image.png

简单改写一下启动器,改写后代码如下:

var _b

!function(n){
var c = {};
function b(e) {
var s = c[e];
if (void 0 !== s)
return s.exports;
var i = c[e] = {
id: e,
loaded: !1,
exports: {}
};
return n[e].call(i.exports, i, i.exports, b),
i.loaded = !0,
i.exports
}
_b = b
}({
//模块
1:function(){console.log(1)},
2:function(){console.log(2)}
})

var p = _b("1")

image.png

2)导进加密模块

根据前面分析,得到这块最先导进的是 “87377” 模块。可以按照顺序先进行导入:

加密函数:

m.default.encryptedString(e)

定义m:

m = E(n(87377))

导入后,发现其实也只需要这一个模块就够了!!!

3)自定义加密函数

其实这块也不用特意写,就按照原本代码中的加密,稍微改写一下就行:

var p = _b("87377")


function encryptedString(e){
try {
var t = e;
(new Date).getTime();
return t = p.default.encryptedString(e),
(new Date).getTime(),
t
} catch (t) {
return e
}

}

4、测试

代码写好后,运行,成功加密:

image.png

三、完整代码

几百行就搞定了,本身还是比较简单的!

var _b

!function(n){
var c = {};
function b(e) {
console.log('-->',e)
var s = c[e];
if (void 0 !== s)
return s.exports;
var i = c[e] = {
id: e,
loaded: !1,
exports: {}
};
return n[e].call(i.exports, i, i.exports, b),
i.loaded = !0,
i.exports
}
_b = b
}({
//模块
87377: function(e, t) {
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
}),
t.default = void 0;
var n, r, o, a = 16, u = a, l = 65536, c = l >>> 1, s = l * l, d = l - 1;
function f(e) {
n = new Array(e);
for (var t = 0; t < n.length; t++)
n[t] = 0;
r = new p,
(o = new p).digits[0] = 1
}
f(20);
g(1e15);
function p(e) {
this.digits = "boolean" == typeof e && 1 == e ? null : n.slice(0),
this.isNeg = !1
}
function m(e) {
var t = new p(!0);
return t.digits = e.digits.slice(0),
t.isNeg = e.isNeg,
t
}
function g(e) {
var t = new p;
t.isNeg = e < 0,
e = Math.abs(e);
for (var n = 0; e > 0; )
t.digits[n++] = e & d,
e >>= a;
return t
}
function h(e) {
for (var t = "", n = e.length - 1; n > -1; --n)
t += e.charAt(n);
return t
}
var _ = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
function T(e, t) {
var n = new p;
n.digits[0] = t;
for (var o = x(e, n), i = _[o[1].digits[0]]; 1 == G(o[0], r); )
o = x(o[0], n),
digit = o[1].digits[0],
i += _[o[1].digits[0]];
return (e.isNeg ? "-" : "") + h(i)
}
var E = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
function y(e) {
var t = "";
for (i = 0; i < 4; ++i)
t += E[15 & e],
e >>>= 4;
return h(t)
}
function S(e) {
for (var t = "", n = (I(e),
I(e)); n > -1; --n)
t += y(e.digits[n]);
return t
}
function v(e) {
return e >= 48 && e <= 57 ? e - 48 : e >= 65 && e <= 90 ? 10 + e - 65 : e >= 97 && e <= 122 ? 10 + e - 97 : 0
}
function A(e) {
for (var t = 0, n = Math.min(e.length, 4), r = 0; r < n; ++r)
t <<= 4,
t |= v(e.charCodeAt(r));
return t
}
function C(e) {
for (var t = new p, n = e.length, r = 0; n > 0; n -= 4,
++r)
t.digits[r] = A(e.substr(Math.max(n - 4, 0), Math.min(n, 4)));
return t
}
function b(e) {
for (var t = "", n = I(e); n > -1; --n)
t += D(e.digits[n]);
return t
}
function D(e) {
var t = String.fromCharCode(255 & e);
return e >>>= 8,
String.fromCharCode(255 & e) + t
}
function P(e, t) {
var n;
if (e.isNeg != t.isNeg)
t.isNeg = !t.isNeg,
n = O(e, t),
t.isNeg = !t.isNeg;
else {
n = new p;
for (var r, o = 0, i = 0; i < e.digits.length; ++i)
r = e.digits[i] + t.digits[i] + o,
n.digits[i] = 65535 & r,
o = Number(r >= l);
n.isNeg = e.isNeg
}
return n
}
function O(e, t) {
var n;
if (e.isNeg != t.isNeg)
t.isNeg = !t.isNeg,
n = P(e, t),
t.isNeg = !t.isNeg;
else {
var r, o;
n = new p,
o = 0;
for (var i = 0; i < e.digits.length; ++i)
r = e.digits[i] - t.digits[i] + o,
n.digits[i] = 65535 & r,
n.digits[i] < 0 && (n.digits[i] += l),
o = 0 - Number(r < 0);
if (-1 == o) {
o = 0;
for (i = 0; i < e.digits.length; ++i)
r = 0 - n.digits[i] + o,
n.digits[i] = 65535 & r,
n.digits[i] < 0 && (n.digits[i] += l),
o = 0 - Number(r < 0);
n.isNeg = !e.isNeg
} else
n.isNeg = e.isNeg
}
return n
}
function I(e) {
for (var t = e.digits.length - 1; t > 0 && 0 == e.digits[t]; )
--t;
return t
}
function L(e) {
var t, n = I(e), r = e.digits[n], o = (n + 1) * u;
for (t = o; t > o - u && 0 == (32768 & r); --t)
r <<= 1;
return t
}
function R(e, t) {
for (var n, r, o, i = new p, u = I(e), l = I(t), c = 0; c <= l; ++c) {
n = 0,
o = c;
for (var s = 0; s <= u; ++s,
++o)
r = i.digits[o] + e.digits[s] * t.digits[c] + n,
i.digits[o] = r & d,
n = r >>> a;
i.digits[c + u + 1] = n
}
return i.isNeg = e.isNeg != t.isNeg,
i
}
function N(e, t) {
var n, r, o, i;
i = new p,
n = I(e),
r = 0;
for (var u = 0; u <= n; ++u)
o = i.digits[u] + e.digits[u] * t + r,
i.digits[u] = o & d,
r = o >>> a;
return i.digits[1 + n] = r,
i
}
function w(e, t, n, r, o) {
for (var i = Math.min(t + o, e.length), a = t, u = r; a < i; ++a,
++u)
n[u] = e[a]
}
var k = new Array(0,32768,49152,57344,61440,63488,64512,65024,65280,65408,65472,65504,65520,65528,65532,65534,65535);
function M(e, t) {
var n = Math.floor(t / u)
, r = new p;
w(e.digits, 0, r.digits, n, r.digits.length - n);
for (var o = t % u, i = u - o, a = r.digits.length - 1, l = a - 1; a > 0; --a,
--l)
r.digits[a] = r.digits[a] << o & d | (r.digits[l] & k[o]) >>> i;
return r.digits[0] = r.digits[a] << o & d,
r.isNeg = e.isNeg,
r
}
var Y = new Array(0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535);
function F(e, t) {
var n = Math.floor(t / u)
, r = new p;
w(e.digits, n, r.digits, 0, e.digits.length - n);
for (var o = t % u, i = u - o, a = 0, l = a + 1; a < r.digits.length - 1; ++a,
++l)
r.digits[a] = r.digits[a] >>> o | (r.digits[l] & Y[o]) << i;
return r.digits[r.digits.length - 1] >>>= o,
r.isNeg = e.isNeg,
r
}
function H(e, t) {
var n = new p;
return w(e.digits, 0, n.digits, t, n.digits.length - t),
n
}
function U(e, t) {
var n = new p;
return w(e.digits, t, n.digits, 0, n.digits.length - t),
n
}
function B(e, t) {
var n = new p;
return w(e.digits, 0, n.digits, 0, t),
n
}
function G(e, t) {
if (e.isNeg != t.isNeg)
return 1 - 2 * Number(e.isNeg);
for (var n = e.digits.length - 1; n >= 0; --n)
if (e.digits[n] != t.digits[n])
return e.isNeg ? 1 - 2 * Number(e.digits[n] > t.digits[n]) : 1 - 2 * Number(e.digits[n] < t.digits[n]);
return 0
}
function x(e, t) {
var n, r, i = L(e), a = L(t), f = t.isNeg;
if (i < a)
return e.isNeg ? ((n = m(o)).isNeg = !t.isNeg,
e.isNeg = !1,
t.isNeg = !1,
r = O(t, e),
e.isNeg = !0,
t.isNeg = f) : (n = new p,
r = m(e)),
new Array(n,r);
n = new p,
r = e;
for (var g = Math.ceil(a / u) - 1, h = 0; t.digits[g] < c; )
t = M(t, 1),
++h,
++a,
g = Math.ceil(a / u) - 1;
r = M(r, h),
i += h;
for (var _ = Math.ceil(i / u) - 1, T = H(t, _ - g); -1 != G(r, T); )
++n.digits[_ - g],
r = O(r, T);
for (var E = _; E > g; --E) {
var y = E >= r.digits.length ? 0 : r.digits[E]
, S = E - 1 >= r.digits.length ? 0 : r.digits[E - 1]
, v = E - 2 >= r.digits.length ? 0 : r.digits[E - 2]
, A = g >= t.digits.length ? 0 : t.digits[g]
, C = g - 1 >= t.digits.length ? 0 : t.digits[g - 1];
n.digits[E - g - 1] = y == A ? d : Math.floor((y * l + S) / A);
for (var b = n.digits[E - g - 1] * (A * l + C), D = y * s + (S * l + v); b > D; )
--n.digits[E - g - 1],
b = n.digits[E - g - 1] * (A * l | C),
D = y * l * l + (S * l + v);
(r = O(r, N(T = H(t, E - g - 1), n.digits[E - g - 1]))).isNeg && (r = P(r, T),
--n.digits[E - g - 1])
}
return r = F(r, h),
n.isNeg = e.isNeg != f,
e.isNeg && (n = f ? P(n, o) : O(n, o),
r = O(t = F(t, h), r)),
0 == r.digits[0] && 0 == I(r) && (r.isNeg = !1),
new Array(n,r)
}
function Z(e) {
this.modulus = m(e),
this.k = I(this.modulus) + 1;
var t, n, r = new p;
r.digits[2 * this.k] = 1,
this.mu = (t = r,
n = this.modulus,
x(t, n)[0]),
this.bkplus1 = new p,
this.bkplus1.digits[this.k + 1] = 1,
this.modulo = J,
this.multiplyMod = X,
this.powMod = j
}
function J(e) {
var t = U(e, this.k - 1)
, n = U(R(t, this.mu), this.k + 1)
, r = O(B(e, this.k + 1), B(R(n, this.modulus), this.k + 1));
r.isNeg && (r = P(r, this.bkplus1));
for (var o = G(r, this.modulus) >= 0; o; )
o = G(r = O(r, this.modulus), this.modulus) >= 0;
return r
}
function X(e, t) {
var n = R(e, t);
return this.modulo(n)
}
function j(e, t) {
var n = new p;
n.digits[0] = 1;
for (var r = e, o = t; 0 != (1 & o.digits[0]) && (n = this.multiplyMod(n, r)),
0 != (o = F(o, 1)).digits[0] || 0 != I(o); )
r = this.multiplyMod(r, r);
return n
}
var K = {};
function W(e, t, n, r) {
this.e = C(e),
this.d = C(t),
this.m = C(n),
this.chunkSize = "number" != typeof r ? 2 * I(this.m) : r / 8,
this.radix = 16,
this.barrett = new Z(this.m)
}
K.NoPadding = "NoPadding",
K.PKCS1Padding = "PKCS1Padding",
K.RawEncoding = "RawEncoding",
K.NumericEncoding = "NumericEncoding";
var Q = null;
var V = {
encryptedString: function(e) {
return Q || (f(262),
Q = new W("10001","","BA58236D7F337C2B728A05F31028833AF83220330B129DC2407109776B644492BD7BBD8B15498C9C510B915FC4C559FE986F61867337785DB32C284C4E07FF256965DE53490CBBA28F14D413D407986ED3DF0E03032031EDD97054C3E6F4F8B322238EB5B0249556F99D9182B281F04B18CE9155332AF71C8A1A2E49087A571B",1024)),
window.btoa(function(e, t, n, r) {
var o, i, a, u, l, c, s, d, f, m = new Array, g = t.length, h = "";
for (u = "string" == typeof n ? n == K.NoPadding ? 1 : n == K.PKCS1Padding ? 2 : 0 : 0,
l = "string" == typeof r && r == K.RawEncoding ? 1 : 0,
1 == u ? g > e.chunkSize && (g = e.chunkSize) : 2 == u && g > e.chunkSize - 11 && (g = e.chunkSize - 11),
o = 0,
i = 2 == u ? g - 1 : e.chunkSize - 1; o < g; )
u ? m[i] = t.charCodeAt(o) : m[o] = t.charCodeAt(o),
o++,
i--;
for (1 == u && (o = 0),
i = e.chunkSize - g % e.chunkSize; i > 0; ) {
if (2 == u) {
for (c = Math.floor(256 * Math.random()); !c; )
c = Math.floor(256 * Math.random());
m[o] = c
} else
m[o] = 0;
o++,
i--
}
for (2 == u && (m[g] = 0,
m[e.chunkSize - 2] = 2,
m[e.chunkSize - 1] = 0),
s = m.length,
o = 0; o < s; o += e.chunkSize) {
for (d = new p,
i = 0,
a = o; a < o + e.chunkSize; ++i)
d.digits[i] = m[a++],
d.digits[i] += m[a++] << 8;
f = e.barrett.powMod(d, e.e),
h += 1 == l ? b(f) : 16 == e.radix ? S(f) : T(f, e.radix)
}
return h
}(Q, e, K.PKCS1Padding, K.RawEncoding))
}
};
t.default = V
},
})

var p = _b("87377")


function encryptedString(e){
try {
var t = e;
(new Date).getTime();
return t = p.default.encryptedString(e),
(new Date).getTime(),
t
} catch (t) {
return e
}

}