网页逆向-xmz前端js混淆逆向

首先还是有个无限debugger的绕过,用hook的方法

想要抓取图片,前端可以看到链接,但是这个链接在直接请求主页之后返回的数据包中是没有的,浏览器展示的elements是css和js综合处理之后的结果,一番处理之后发现请求的数据包

找到发送请求的函数栈,在N.send(s.data ? s.data : null),处打上断点,找一个新的图片去访问,这里不知道为什么直接刷新网页,会断不下来,定位到上层函数

'\x73\x75\x63\x63\x65\x73\x73' 就是字符串'success',也就是ajax请求发送成功之后调用的函数,解密函数就在这里

1
2
3
4
5
'\x73\x75\x63\x63\x65\x73\x73': function(_0xf3a52c) {
var _0xcedda6 = _0x36aa06;
loadData(_0x24de4c, _0xf3a52c[_0xcedda6(_0x439456._0x2521f7)], _0x41cb7d, !![]),
sessionStorage['\x73\x65\x74\x49\x74' + '\x65\x6d']('\x63\x61\x63\x68\x65' + '\x5f' + _0x24de4c, _0xf3a52c['\x64\x61\x74\x61']);
},

sessionStorage函数是往本地存数据的,在下次访问的时候直接从本地加载,这个不用管,主要看loadData ,在loadData里下断点

kkmzt_5.PNG

断下来之后发现_0x247b9c是返回数据包里的data ,而这个变量只在_0x36995d = _0x66f3q(_0x4c3130, _0x247b9c)处被用到,猜测该处就是做解密处理的,进入到这个函数

kkmzt_6.PNG

kkmzt_7.PNG

发现_0x1739fa变量只在_0x14cbdb = _0x1739fa[_0xad1455(0xca)](_0x587991)[0x2 * -0x404 + 0x23d8 + 0x1 * -0x1bcf] 处被用到

kkmzt_8.PNG

单步运行到_0x14cbdb = _0x1739fa[_0xad1455(0xca)](_0x587991)[0x2 * -0x404 + 0x23d8 + 0x1 * -0x1bcf] 处,查看变量_0xad1455(0xca)就是字符串'split' ,而_0x1739fadata_0x587991是另一个字符串,0x2 * -0x404 + 0x23d8 + 0x1 * -0x1bcf是1,也就是把data分隔之后去某个部分赋值给_0x14cbdb

上面可以看到CryptoJS关键字,明显是CryptoJS解密的

也就是这里

1
2
3
4
5
_0x1fa49a = _0x2fe947[_0xad1455(_0x140497._0x3f5f90)][_0xad1455(_0x140497._0x391976) + '\x70\x74'](_0x3957c4, _0x39ea15, {
'\x69\x76': _0x2fe947['\x65\x6e\x63'][_0xad1455(0xdc)]['\x70\x61\x72\x73\x65'](_0x36b770),
'\x6d\x6f\x64\x65': _0x2fe947[_0xad1455(0xd2)][_0xad1455(0xd5)],
'\x70\x61\x64\x64\x69\x6e\x67': _0x2fe947[_0xad1455(_0x140497._0x10bb0f)]['\x50\x6b\x63\x73\x37']
})

[_0xad1455(_0x140497._0x391976) + '\x70\x74' 就是字符串decrypt_0x3957c4是要解密的数据,_0x39ea15是key

稍微分析一下可以知道,加密方式是AES,mode是CBC,填充方式是PKCS7,而且数据是先进行hex解码(_0x2c9eda = _0x2fe947[_0xad1455(0xce)]['\x48\x65\x78']['\x70\x61\x72\x73\x65'](_0x14cbdb)),再进行base64编码(_0x3957c4 = _0x2fe947['\x65\x6e\x63'][_0xad1455(0xa6) + '\x34'][_0xad1455(_0x140497._0x492099) + _0xad1455(0x9c)](_0x2c9eda))

把动态调试的key和iv丢到解密里面去也能验证,这里key要用_0x39ea15.toString()去访问