JS逆向-将接口返回的加密数据进行解密
背景
●接口数据被加密,通过影刀【HTTP下载】和【开始网页监听指令】虽然能够得到返回的数据,但是数据被加密,我们不知道数据内容,也就无法进行下一步操作。
●出于对数据安全的考虑,现代化的网站/APP通常会对数据接口做加密处理。而分析这些接口的加密算法并实现模拟调用的过程就叫做「逆向」。
逆向流程
网站链接:企名片-中国领先的商业信息服务平台
💡 1.找到数据请求的接口名称
如下图,表格里的数据是通过【productListVip】这个接口进行请求的,而且看预览里的返回参数,【encrypt_data】是一段字母+符号+数字,也就是被加密的数据。
💡 2.为此请求加一个XHR断点
首先点击【源代码】,然后点击加号添加刚才的请求名称
接下来我们在开发者工具里使用快捷键【 Ctrl+Shift+F 】唤起底部搜索,并输入被加密的参数【encrypt_data】并按下回车
美观输出 { } 点击之后,我们在这个 js 文件里按下【 Ctrl+F 】搜索 js 文件里的 【encrypt_data】,然后点击这一行的行号即可加断点
可能你会想为什么不要其他的,而只要这一条,因为其他的几条都带有 .img_url,显然不是【encrypt_data】
💡 3.接下来开始调试并找到解密函数
按下F5刷新页面之后,可看到程序运行到断点处会停止,然后每按下一次F8,在下方控制台输入【Object(d.a)(t.encrypt_data)】并回车,可看到在这个加密流程里每次打印的数据都不一样,说明网页里的数据都是使用的这个函数。
接下来我们把鼠标移入可出现详细信息,点击js进入
进入之后,给函数加一个断点,然后继续按下F8执行脚本
当执行到这个位置之后,我们可以看到这个函数里包含两个函数 function o(){} 和 function decode(){},此时我们可以按照如下方法,找到 function o(){}的函数所在位置以及 function decode(){}所在位置
function s(e) {
return JSON.parse(o("5e5062e82f15fe4ca9d24bc5", a.a.decode(e), 0, 0, "012345677890123", 1))
}
小提示:在此处可快速找到断点位置,鼠标移入-按下鼠标右键-选择显示位置
此时我们已找完解密函数,我们新建一个HTML页面,在编辑器里尝试一下解密。
文件如下(可恶,要会员,附件没法上传):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>解密</title>
</head>
<body>
<script>
function o(e, t, i, n, a, o) {
var s, c, r, l, d, u, h, p, f, m, v, g, y, b, C = new Array(16843776, 0, 65536, 16843780, 16842756, 66564,
4, 65536, 1024, 16843776, 16843780, 1024, 16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240,
66560, 66560, 16842752, 16842752, 16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564,
16777216, 65536, 16843780, 4, 16842752, 16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560,
16777220, 1024, 4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220, 1028, 66564,
16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756),
_ = new Array(-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -
2147483616, -2146402272, -2146402304, -2147483648, -2147450880, 1048576, 32, -2146435040, 1081344,
1048608, -2147450848, 0, -2147483648, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344,
32800, -2146402304, -2146435072, 32800, 0, 1081376, -2146435040, 1048576, -2147450848, -2146435072,
-2146402304, 32768, -2146435072, -2147450880, 32, -2146402272, 1081376, 32, 32768, -2147483648,
32800, -2146402304, 1048576, -2147483616, 1048608, -2147450848, -2147483616, 1048608, 1081344, 0, -
2147450880, 32800, -2147483648, -2146435040, -2146402272, 1081344),
w = new Array(520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736,
134217736, 131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584,
134348800, 134348808, 131592, 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728,
134349312, 134217728, 131080, 520, 131072, 134349312, 134218240, 0, 512, 131080, 134349320,
134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728, 134349320, 8, 131592, 131584,
134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584),
k = new Array(8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929,
129, 0, 8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320,
8388736, 8192, 8396928, 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320,
8388736, 8388737, 1, 8396801, 8321, 8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928,
8388737, 8193, 8320, 8388608, 8396801, 128, 8388608, 8192, 8396928),
x = new Array(256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368,
524288, 33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112,
1074266112, 0, 1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256,
34078976, 33554432, 1107296256, 524544, 524288, 1107296512, 256, 33554432, 1073741824, 34078720,
1107296512, 1074266368, 33554688, 1073741824, 1107820544, 34078976, 1074266368, 256, 33554432,
1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720, 0, 1074266112, 1107296256, 524544,
33554688, 1073742080, 524288, 0, 1074266112, 34078976, 1073742080),
T = new Array(536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296,
4210704, 4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384,
4210688, 536887312, 16, 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600,
536870912, 536887296, 16, 541065232, 4210688, 541081616, 4194304, 16400, 536870928, 4194304,
536887296, 536870912, 16400, 536870928, 541081616, 4210688, 541065216, 4210704, 541081600, 0,
541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0, 541081600, 536870912,
4194320, 536887312),
A = new Array(2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0,
67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016,
69208064, 2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200,
2097152, 67110914, 67110914, 69206018, 69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064,
2050, 2099202, 69208064, 2050, 67108866, 69208066, 69206016, 2099200, 0, 2, 69208066, 0, 2099202,
69206016, 2048, 67108866, 67110912, 2048, 2097154),
N = new Array(268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208,
268697600, 268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160,
266240, 262208, 268697664, 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144,
266304, 262144, 268701696, 4096, 64, 268697664, 4096, 266304, 268439552, 64, 268435520, 268697600,
268697664, 268435456, 262144, 268439616, 0, 268701760, 262208, 268435520, 268697600, 268439552,
268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208, 268435456, 268701696),
$ = function (e) {
for (var t, i, n, a = new Array(0, 4, 536870912, 536870916, 65536, 65540, 536936448, 536936452, 512,
516, 536871424, 536871428, 66048, 66052, 536936960, 536936964), o = new Array(0, 1,
1048576, 1048577, 67108864, 67108865, 68157440, 68157441, 256, 257, 1048832, 1048833,
67109120, 67109121, 68157696, 68157697), s = new Array(0, 8, 2048, 2056, 16777216,
16777224, 16779264, 16779272, 0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272),
c = new Array(0, 2097152, 134217728, 136314880, 8192, 2105344, 134225920, 136323072, 131072,
2228224, 134348800, 136445952, 139264, 2236416, 134356992, 136454144), r = new Array(0,
262144, 16, 262160, 0, 262144, 16, 262160, 4096, 266240, 4112, 266256, 4096, 266240,
4112, 266256), l = new Array(0, 1024, 32, 1056, 0, 1024, 32, 1056, 33554432, 33555456,
33554464, 33555488, 33554432, 33555456, 33554464, 33555488), d = new Array(0, 268435456,
524288, 268959744, 2, 268435458, 524290, 268959746, 0, 268435456, 524288, 268959744, 2,
268435458, 524290, 268959746), u = new Array(0, 65536, 2048, 67584, 536870912,
536936448, 536872960, 536938496, 131072, 196608, 133120, 198656, 537001984, 537067520,
537004032, 537069568), h = new Array(0, 262144, 0, 262144, 2, 262146, 2, 262146,
33554432, 33816576, 33554432, 33816576, 33554434, 33816578, 33554434, 33816578), p =
new Array(0, 268435456, 8, 268435464, 0, 268435456, 8, 268435464, 1024, 268436480, 1032,
268436488, 1024, 268436480, 1032, 268436488), f = new Array(0, 32, 0, 32, 1048576,
1048608, 1048576, 1048608, 8192, 8224, 8192, 8224, 1056768, 1056800, 1056768, 1056800),
m = new Array(0, 16777216, 512, 16777728, 2097152, 18874368, 2097664, 18874880, 67108864,
83886080, 67109376, 83886592, 69206016, 85983232, 69206528, 85983744), v = new Array(0,
4096, 134217728, 134221824, 524288, 528384, 134742016, 134746112, 16, 4112, 134217744,
134221840, 524304, 528400, 134742032, 134746128), g = new Array(0, 4, 256, 260, 0, 4,
256, 260, 1, 5, 257, 261, 1, 5, 257, 261), y = e.length > 8 ? 3 : 1, b = new Array(32 *
y), C = new Array(0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0), _ = 0, w = 0, k =
0; k < y; k++) {
var x = e.charCodeAt(_++) << 24 | e.charCodeAt(_++) << 16 | e.charCodeAt(_++) << 8 | e
.charCodeAt(_++),
T = e.charCodeAt(_++) << 24 | e.charCodeAt(_++) << 16 | e.charCodeAt(_++) << 8 | e
.charCodeAt(_++);
x ^= (n = 252645135 & (x >>> 4 ^ T)) << 4,
x ^= n = 65535 & ((T ^= n) >>> -16 ^ x),
x ^= (n = 858993459 & (x >>> 2 ^ (T ^= n << -16))) << 2,
x ^= n = 65535 & ((T ^= n) >>> -16 ^ x),
x ^= (n = 1431655765 & (x >>> 1 ^ (T ^= n << -16))) << 1,
x ^= n = 16711935 & ((T ^= n) >>> 8 ^ x),
n = (x ^= (n = 1431655765 & (x >>> 1 ^ (T ^= n << 8))) << 1) << 8 | (T ^= n) >>> 20 & 240,
x = T << 24 | T << 8 & 16711680 | T >>> 8 & 65280 | T >>> 24 & 240,
T = n;
for (var A = 0; A < C.length; A++)
C[A] ? (x = x << 2 | x >>> 26,
T = T << 2 | T >>> 26) : (x = x << 1 | x >>> 27,
T = T << 1 | T >>> 27),
T &= -15,
t = a[(x &= -15) >>> 28] | o[x >>> 24 & 15] | s[x >>> 20 & 15] | c[x >>> 16 & 15] | r[x >>>
12 & 15] | l[x >>> 8 & 15] | d[x >>> 4 & 15],
i = u[T >>> 28] | h[T >>> 24 & 15] | p[T >>> 20 & 15] | f[T >>> 16 & 15] | m[T >>> 12 &
15] | v[T >>> 8 & 15] | g[T >>> 4 & 15],
n = 65535 & (i >>> 16 ^ t),
b[w++] = t ^ n,
b[w++] = i ^ n << 16
}
return b
}(e),