某WX小程序包签名生成

一、解包

首先我们在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, 可以发现 解密成功!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值