一、解包
首先我们在pc端登录微、信
然后在电脑的这个文件里面 会有小程序包的文件
这种以wx开头的文件就是小程序包的文件
我们可以在之前把这个applet文件清空 然后再打开小程序 这个文件就生成了
在文件夹里面 会有一个_APP_.wxapkg的文件 这个就是小程序主包的文件了
我们使用工具解包 (网上搜小程序解包工具 )
工具解包之后 在wxpack目录下 会有一个.wxapkg后缀的文件
然后在使用nodejs反编译这个文件(需要装nodejs环境 以及安装依赖包)
然后切到nodejs的工具包 目录 cmd (记得顺便把上面这个.wxapkg文件也一同拖到同级目录下 方便点)
在之后输入命令 node wuWxapkg.js wx35849c7f0cf7f7a9.wxapkg
完成之后 会生成一个对应的文件夹
可以看到 里面就是反编译出来的内容了
二、动态调试
接下来 就需要一个工具 微信开发者工具 直接百度搜索官网下载就行
选择 导入 这个文件夹
点击确定
这里就能看到代码了 O Yean!
注意 左侧可能小程序会白屏 这里 我们设置下
这样就行了
在请求头中可以看到是有签名的 那么就解下这个sign
我们在小程序代码中搜索下关键字
在这里 可以发现 sign 是通过k这个函数和5个参数生成
直接下断点 看看
可以发现 第一个参数 是url 的path,第二个参数是请求参数通过key =value扔进一个列表里面,
第三个参数是一个固定字符串(在上面的代码定义的),第四个参数是请求方式,第五个参数是请求头中的Authorization,也可以看做是一个固定字符串
那么再看看这个k函数
k = function(e, t, n, r, a) {
for (var o = r + e + "?", i = t.sort(), c = 0; c < i.length; c++) o += i[c] + "&";
return o = o.substring(0, o.length - 1) + n, a && a.indexOf("Bearer") > -1 && (o += a),
l.MD5(o).toString(l.enc.Hex);
}
这里可以看出 他是先把列表排序 然后进行一系列字符串 拼接 再生成md5值
具体的逻辑 可以不管 我们直接扣出这个函数使用就行 因为已经知道了他的参数
而且 这个函数也没有嵌套其他的函数或者变量
这里可以发现 这个E就是请求的地址了
好了 分析完成
三、模拟请求
使用py还原下 代码 看看
200!ok,sign是没有问题的(sign错的话 会403)
这里还有个问题 就是返回的数据加密了。
从抓包工具也可以看到数据是加密的
加密有很多种 AES,DES,RSA,HMAC等等 都试着搜搜
不过我研究过它的app代码 已经知道是用的AES加密
通过搜索后 会发现这部分代码
decryptData: function(e) {
try {
if (e && "string" == typeof e) {
var t = e.replace(/[\t\n\r]/gi, ""), n = w(), r = "";
if (n > 0) {
var a = h[n];
r = l.enc.Utf8.parse(a.dataSecret);
} else r = l.enc.Utf8.parse(g.dataSecret);
var o = l.AES.decrypt(t, r, {
mode: l.mode.ECB,
padding: l.pad.Pkcs7
});
return JSON.parse(o.toString(l.enc.Utf8));
}
} catch (e) {
console.error(e);
}
return e;
},
这里可以发现加密方式 和它的模式 AES 的ECB pad.Pkcs7
接着找下秘钥
n = w()
if (n > 0) {
var a = h[n];
r = l.enc.Utf8.parse(a.dataSecret);
} else r = l.enc.Utf8.parse(g.dataSecret);
这里可以看到 秘钥是通过一个if else控制的 这里先看看这个n的值是什么 n=w()
w = function() {
return 0;
}
从之前的代码 可以发现 n 是等于0的
那么这个秘钥就是
l.enc.Utf8.parse(g.dataSecret);
g = {
host: "xxxxx",
powerHost: "xxxxxx",
secret: "F1D4FBbF32B593e8DF0F2f58Aff5F2C3",
dataSecret: "nvukPrdsceR2iOP2"
}
秘钥就是这个了"nvukPrdsceR2iOP2"
好了 在改下代码 试试看
OK, 可以发现 解密成功!