1、目标网址:https://www.qimingpian.com/finosda/project/pinvestment
2、抓包查看响应体:
3、数据加密
4、打上断电进行调试
5、抠出代码进行运行
6、总结
function o(t)就是我们需要的解密函数,可以看到它先调用s函数,传入了四个参数,除了a.a.decode(t)外其他三个都是写死的,最后用JSON.parse转为json对象。
然而,找到解密函数后,我们要做的不是去分析它函数内部做了什么,虽然可以研究它的解密算法然后用Python重写,但这样太复杂且没必要。因为我们可以用PyExecJS这个库,直接用Python调用并执行js代码。
这时候,WebStorm就派上用场了。新建一个js文件,把function o里涉及的代码全部抠下来。然后执行console.log把执行结果打印出来。篇幅问题就只贴部分代码:
//解密函数
function my_decrypt(t) {
return JSON.parse(s("5e5062e82f15fe4ca9d24bc5", my_decode(t), 0, 0, "012345677890123", 1))
}
//解密函数依赖项
function my_decode(t) {
c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
f = /[\t\n\f\r ]/g
var e = (t = String(t).replace(f, "")).length;
e % 4 == 0 && (e = (t = t.replace(/==?$/, "")).length),
(e % 4 == 1 || /[^+a-zA-Z0-9/]/.test(t)) && l("Invalid character: the string to be decoded is not correctly encoded.");
for (var n, r, i = 0, o = "", a = -1; ++a < e; )
r = c.indexOf(t.charAt(a)),
n = i % 4 ? 64 * n + r : r,
i++ % 4 && (o += String.fromCharCode(255 & n >> (-2 * i & 6)));
return o
}
//测试代码,加密参数太长就不贴上来了
encrypt_data = "xxx"
decrypt_data = my_decrypt(encrypt_data)
console.log(decrypt_data)
确实是我们需要的数据没错,最后用Python去调用解密函数就行了。调用时还有个需要注意的地方,因为直接返回object给Python会报错,所以这里将JSON.parse移除了,返回parse前的json字符串,
//解密函数
function my_decrypt(t) {
return s("5e5062e82f15fe4ca9d24bc5", my_decode(t), 0, 0, "012345677890123", 1)
}
然后在Python中用base64库的b64decode方法来解码即可。
本文所有代码已上传至Github,旨在学习和技术分享,请勿用于商业用途。
总结