背景与挑战
Shopee 的 x-sap 加密算法为了防止逆向调试,采取了每 3 小时自动重新编译更新主要 sap 算法 js 的手段,因此使用传统的逆向分析手段可能有些受限。下面分析采用 rpc 方式生成算法并检验(以 id 站点为例)。
接口定位
目标接口为:
/api/v4/pdp/get_pc
核心逻辑分析
加密算法所在文件路径如下:
https://deo.shopeemobile.com/shopee/modules-federation/live/0/shopee__web_enhance_sap/2.35.165.js
项目采用 sekiro-jsrpc 链接到此执行入口。刷新页面并在关键位置设置断点,向上追溯找到算法计算入口 b.ABY。

在此处创建断点,观察调用栈。

从 initiator 找到大致入口,点击进入查看具体实现。

以下是关键的客户端初始化代码片段,用于建立 WebSocket 连接并注册 action:
(()=>{ function SekiroClient(e) { if (this.wsURL = e, this.handlers = {}, this.socket = {}, !e) throw new Error("wsURL can not be empty!!"); this.webSocketFactory = this.resolveWebSocketFactory(), this.connect() } SekiroClient.. = () { ( == ) { e = . ? . : .; () { () { . = (o) } t.. = () { ..() }, t.. = () { .. = e }, t.. = () { .. = e }, t.. = () { .. = e }, t.. = () { ..(e) }, (o) } } ( == weex) { .(); o = weex.(); .( + o), () { { o.() } (t) {} o.(e, ), o } } (t) { .(t) } ( == ) () { (o) }; () }, .. = () { .( + .); e = ; { . = .(.) } (o) { .(), (() { e.() }, ) } ..(() { e.(o.) }), ..(() { .() }), ..(() { .(), (() { e.() }, ) }) }, .. = () { .( + e); o = .(e), t = o.; (!o.) .(t, ); n = o.; (!.[n]) .(t, + n + ); s = .[n], i = ; { (o, () { { i.(t, e) } (o) { i.(t, + o) } }, () { i.(t, e) }) } (r) { .( + r), i.(t, + r) } }, .. = () { t; ( == o) { t = .(o) } (n) { t = {}, t. = o } == o ? t = o : (t = {}, t. = o); (.(t) || == t) && (t = { : t, : }), t. ? t. = : t. ? t. = : t. = , t. = e; s = .(t); .( + s), ..(s) }, .. = () { != o && (o = .(o)); t = {}; t. = o, t. = -, t. = e; n = .(t); .( + n), ..(n) }, .. = () { ( != e) (); ( != o) (); .( + e), .[e] = o, }; client = (); client.(, () { url = request.; body = request.; resp = b.(url, body); (resp); }); })();


