相关藏品信息
这里会发现会有两个请求
这里会返回一个data 类似秘钥的东西 先不管 后续再看
这个v2 这个请求就是获取数据的接口了 接着看下它的请求头
这里有一个sig 应该就是签名了
接着再看下请求的参数
可以发现 发送post请求的参数sig也在这里面 那么这个就必须要解了
接着跟进调用栈
这个 就顾名思义了哈
进去看看 打个断点
找到了 ~ 就在这里生成的.
dataResultFun = dataresult.split(",")[0].substr(4),
dataResultId = dataresult.split(",")[1].split("=")[1],
sigresult = eval(dataResultFun),
sigData = _utils_aes__WEBPACK_IMPORTED_MODULE_25__["a"].encryptSelf(dataResultId, sigresult)),
可以发现 sig是通过encryptSelf这个函数传了两个参数生成的
而这两个参数又是通过一个字符串通过split切分出来的
那么关键点就要找到这个字符串dataresult怎么来的
接着分析
sig.data.code && (dataresult = _utils_aes__WEBPACK_IMPORTED_MODULE_25__["a"].decrypt(sig.data.data),
这里发现 这个字符串是通过 把第一次get请求返回的data通过decrypt函数解密出来的
那么就来看看这个decrypt函数
很明显 这是个AES解密
可以发现 这个data通过aes解密出来是一段 字符串代码
这就迎刃而解了
sigresult这个参数则是通过eval这段代码出来的 dataResultId是通过切分字符串来的
好了接着看下这个encryptSelf 函数
这也是个AES加密
这里其实早可以发现 这个o.a其实就是js引入的crypto-js这个包
CryptoJS = require("crypto-js");
window = global;
window.deciphering = function(e,t){t=t||32;for(var n="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",a=n.length,c=0;c<t;c++)n.charAt(Math.floor(Math.random()*a));return e}
function get_eval_str(e ,key){
t = CryptoJS.enc.Base64.parse(key)
res1 = CryptoJS.AES.decrypt(e, t, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8)
return res1
}
function get_num(str){
rs = eval(str)
return rs
}
function encryptSelf(t, n) {
var a = CryptoJS.enc.Base64.parse("4tBlCLWFZ3eD93CvDE2lpw==")
, c = JSON.stringify({
id: t.substr(0, t.length - 1),
sum: n
})
, i = CryptoJS.enc.Utf8.parse(c)
, s = CryptoJS.AES.encrypt(i, a, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return s.toString()
}
re = encryptSelf("a3bc847b6172c436272e5826efbf94f9}", 86957757392)
//ss = get_num('(function(){let a=782;let b=158;let x=597;let y=748;let result=x*a - y*b ;return window.deciphering(result)})();')
console.log(re)
好了 我们直接在本地通过node 还原这部分代码 计算下签名
接着用py模拟试下
ok !