CZ航司shopping JS逆向分析技术大纲
aHR0cHM6Ly93d3cuY3NhaXIuY29tL2NuL2luZGV4LnNodG1s
技术背景与目标
- 分析CZ航司shopping逻辑
- 代码实现
- acw_sc__v2还原
关键逆向步骤
-
抓包分析
点击支付触发跳转页面(这里一ZFB方式讲解)

调用了payment接口,然后里面重定向到showay收银台页面,请求参数是订单号加上一个固定值inter=undefined

payment会出现三种情况,一种是滑块风控,一种是acw_sc_v2,最后一种是正常跳转。除了正常跳转,剩下两个都需要再次请求payment
acw_sc_v2情况:

滑块情况:


最后走paySubmit接口,也是两种情况,一种是站内弹出二维码,另一种是网页跳转
站内弹出:返回数据里面的payForm返回的是base64编码图片submit入参是,token是payment重定向的链接提取

网页跳转:返回from表单进行提交
获取表单进行提交数据。然后重定向到appAssign
最后跳转到真正支付页面
-
payment接口:入参一个订单号,一个定值
acw_sc_v2情况:
页面返回一个arg1和一个js块。根据arg1和js块来生产acw_sc_v2最后再次更新这个值到cookie里面并请求

-
acw_sc_v2:
这里以查价来讲解逻辑,首先写一个cookie的hook脚本,清空acw_sc_v2的值并cha(function() { // 检查是否已经hook if (window.__cookieHooked) { console.log('Cookie hook already installed.'); return; } // 获取原始的cookie属性描述符 let originalDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie'); if (!originalDescriptor) { // 如果原型上没有,尝试直接获取document自身属性(某些浏览器可能不同) originalDescriptor = Object.getOwnPropertyDescriptor(document, 'cookie'); } if (!originalDescriptor || !originalDescriptor.get || !originalDescriptor.set) { console.error('Unable to get original cookie descriptor'); return; } const originalGet = originalDescriptor.get; const originalSet = originalDescriptor.set; // 重新定义document上的cookie属性 Object.defineProperty(document, 'cookie', { get: function() { debugger; // 在get时中断 console.log('Getting cookie'); // 额外日志 return originalGet.call(this); }, set: function(value) { debugger; // 在set时中断 console.log('Setting cookie to:', value); return originalSet.call(this, value); }, configurable: true, enumerable: true }); window.__cookieHooked = true; console.log('Cookie hook installed successfully. Cookie get/set will trigger debugger.'); })();跟栈

找到wa的值是所需值
然后上一步看到所传参数是一个arg1,一个url的参数
awc_sc_v2:扣代码实现

paysubmit接口:入参提取payment的重定向链接的token并传入data
站内弹出二维码:根据接口的payForm字段来判断,如果是以data:开头的则返回的base64的图片,反之是跳转页面。写一个base64转码就行
跳转页面:接口返回表单,利用正则提取出数据并请求pay接口。提取cz订单号,zfb订单号,金额,交易类型等然后重定向到appAssign后最后重定向到真正页面并返回html
整合代码
- payment获取收银台页面

acw_sc_v2情况,获取完该值并重新调用
- paySubmit获取ZFB响应

判断响应类型是站内跳转,还是网页跳转
跳转页面,请求支付并保存html
成果展示

反爬策略应对
- 处理动态Cookie acw_sc_v2
- 模拟浏览器指纹(
User-Agent、WebGL渲染) - 对抗代码混淆(通过AST还原变量名和逻辑)
注意事项
- 法律风险提示:仅限技术研究,禁止商业滥用
- 混淆代码的常见特征(如十六进制编码、控制流扁平化)
- 推荐学习资源(如《JavaScript逆向工程实战》)