地址:
d5d2aa1e5acf92ac6fadf6a2ba68734dcf2dfb581261dac8fc67a4a3390c06e9
接口:
2d74917137a05047e8d6ce026c01d8f6affef71f566f9898943237104f4ceb8c
以fetch(node.js)格式复制请求,对比后发现参数变化
工具网站(在线代码对比):0b2K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6@1k6i4S2@1k6r3W2X3k6W2)9J5k6h3!0B7k6h3&6S2K9g2)9J5k6h3y4G2L8g2)9J5c8R3`.`.


这里面有2个,都打上断点,其中有一个函数是没有用到的

function f(t)对外暴露的是函数a

从调用堆栈往上追一下,看看是谁在调用

这样就定位到我们的请求头构建函数了,而且把传入的参数e也定位到了,从控制台打印一下e,复制下来,这是前面各种环境检测后的初始值,后面加密运算用的输入参数,右键复制object,在js代码中定义一个参数e备用

再回到我们当前断点的堆栈上,找到所属的函数模块key

现在只需要用加载器函数,调用这个就可以了
上面的代码就把请求头中的参数都做完加密了,检查后,发现还缺少一个参数x-tingyun,重新搜索定位一下,并打个断点

从代码对比上看,这里就n发生了变化,n的生成函数就在前面,调用了G函数,悬浮一下就能直接抓到

复制下来,这样所有的请求参数就都获取到了
响应出来的json都是密文,而且可以看到和请求参数值很像。有经验的可以想到里面会有拦截器,我没有按照这个方法去找,还是从堆栈里面找到的

request后就这三个调用,挨个找一下并打断点,很容易定位到解密函数

打上后耐心点逐步调试,看到这个e.data的时候,打个断点,然后打印看一下e,里面有解密好的数据,在e.data.data.list里面

现在就成功定位到了解密函数,然后看一下传入的是什么参数,就能够执行了
很容易找到,解密函数就是加密函数中的b函数,e.data往上找找看,是请求后的返回值
同样的方法调用解密函数
js代码的框架
能够正常获取,注释掉一部分加密参数也可以获取到,比想象中简单一些

let window = globalThis;
!function (e) {
function o(t) {
if (n[t])
return n[t].exports;
var i = n[t] = {
i: t,
l: !1,
exports: {}
};
return e[t].call(i.exports, i, i.exports, o),
i.l = !0,
i.exports
}
window.o = o;
}({
key : function(){}
})
let e = {};
window.data = window.o("7d92").a(e);
let window = globalThis;
!function (e) {
function o(t) {
if (n[t])
return n[t].exports;
var i = n[t] = {
i: t,
l: !1,
exports: {}
};
return e[t].call(i.exports, i, i.exports, o),
i.l = !0,
i.exports
}
window.o = o;
}({
key : function(){}
})
let e = {};
window.data = window.o("7d92").a(e);
return e.data.data.appCode && (e.data.data = Object(c.b)("SM4", e.data)),
return e.data.data.appCode && (e.data.data = Object(c.b)("SM4", e.data)),
o.a.interceptors.response.use((function(e) {}
o.a.interceptors.response.use((function(e) {}
let findate = window.o("7d92").b("SM4", await response.json())
console.log(JSON.stringify(findate.list));
let findate = window.o("7d92").b("SM4", await response.json())
console.log(JSON.stringify(findate.list));
import subprocess
import json
import os
def execute_js(js_input, js_path):
js_input_json = json.dumps(js_input, ensure_ascii=False)
try:
process = subprocess.Popen(
["node", js_path],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
encoding="utf-8",
cwd=os.path.dirname(os.path.abspath(__file__)),
)
stdout, stderr = process.communicate(input=js_input_json)
if process.returncode != 0:
error_info = json.loads(stderr) if stderr else {"message": "未知错误"}
raise Exception(
f"JS执行失败:{error_info['message']}(详情:{error_info.get('stack', '')})"
)
result = json.loads(stdout)
return result
except json.JSONDecodeError as e:
raise Exception(f"结果解析失败:{e}(输出:{stdout},错误:{stderr})")
except Exception as e:
raise Exception(f"执行异常:{e}")
if __name__ == "__main__":
for i in range(1, 2):
js_input, js_path = {"pageNum": i}, "../JavaScript/main.js"
result = execute_js(js_input, js_path)
print(f"JS执行结果page {i}:", result)
import subprocess
import json
import os
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!
最后于 1天前
被blackfoxdu编辑
,原因: 格式调整