案例地址:某路黔寻小程序。
获取PKG
小程序PKG获取方法不再说了,可以看之前的案例文章。
不管从移动设备还是windows上获取的都可以。
我把wxApkg文件链接放文章最后了,大家可以自行下载。
注意windwos上获取下来的需要解密后再反编译。
静态分析
源码并没有混淆,全局搜索关键词。
sign = a.c(e(e({}, d), r))
a = require("979128172C6AC8FFF1F74010FB87AB43.js")
e = require("@babel/runtime/helpers/objectSpread2.js")
d = e(e({}, o), {}, {
userId: wx.getStorageSync("userInfo").userId || "",
userToken: wx.getStorageSync("userInfo").token || ""
});
a.c
e({}, d), r || {}
e是require的 "@babel/runtime/helpers/objectSpread2.js"
d 是undefined
所以sign生成是 a.c(请求参数,入参r)
动态调试
现在看不出来r是什么,编译下小程序进行调试。
typeof 报错了,打开本地设置,取消将JS编译成ES5的勾选。
可以编译了
如果报错没云开发权限,可以先不管。 在a.c中加入console调试。
进入分类页,发起请求,触发console。
看来我们分析的正确,参数一是请求参数,参数二目前为{}。
当userId和userToken为空时, (o = "".concat(o).concat(JSON.stringify(n))) 返回的是:
os=APPLET&osVersion=1.0.0&userId=&userToken=e348db70-2e67-4a72-9578-8b40ad809cbb{}
经过replace和正则处理后的结果是:
os=APPLET&osVgrsion=1.0.0&usgrId=&usgrTokgn=g348db70-2g67-4c72-9578-8b40cd809cbb{}
最终的sign是: 9F00FD42321B5FB62FAA30E72D59DDB9
我们把字符串放到在线md5加密上试试
可以发现,最终的sign是经过replace和正则处理后的结果进行普通的MD5加密。
现在更换到商品接口,参数二发生了变化。
MD5前的字符串:
os=APPLET&osVgrsion=1.0.0&usgrId=&usgrTokgn=g348db70-2g67-4c72-9578-8b40cd809cbb{"cctggoryId":null,"topLgvglId":null,"kgyword":null,"pcgg":1,"sizg":10,"sort":null,"mobilg":null,"lgvglId":null,"lgvglCodg":null,"intggrclTypg":null}
MD5后:178AE876D79D1C218C84615DA768FADB
usgrTokgn目前来看,未登录时是固定的, 为e348db70-2e67-4a72-9578-8b40ad809cbb。
参数一中的 userId 和 token 登录后会有,未登录时为null。
扣代码
补代码的时候需要注意,a.c复制下来之后,根据报错发现需要补e.edefault
找了一下位置,在A28A52462C6AC8FFC4EC3A410957AB43.js文件中。
所以把这个文件的JS代码都拿下来继续调试。
补好的JS代码:
【温馨提示:此处隐藏内容需要付费订阅后才能查看!】
经过对比,生成的sign值相同。
Python还原
逻辑分析清楚后,还原就很简单了。
【温馨提示:此处隐藏内容需要付费订阅后才能查看!】
备注
切勿用于商业行为,作者对文章内容滥用导致出现的任何问题概不负责!
PKG链接: https://pan.baidu.com/s/1yP4YPHb7Sf5tskrh-1u5Iw?pwd=pjxm